Preskoči na vsebino

Učinkovitost

shikiphp izvaja pravo tokenizacijo TextMate v čistem PHP, zato je smiselno odkrito povedati, kje je hiter in kje ne.

Kaj pričakovati

Pričakujte desetine do stotine milisekund na datoteko, ne mikrosekund. Tokenizator predpomni prevedena pravila in skenerje, slovnice se nalagajo po potrebi (vzorec, ki nikoli ne uporablja vdelanega jezika, ne porabi časa za njegovo dekodiranje), večina vzorcev slovnic pa se izvaja prek izvornega preg_* s hitro potjo PCRE, katere enakovrednost je preverjena; za ostalo poskrbi ujemalnik čistih PHP (glejte Arhitektura).

To so časi za ogret sistem pri enem klicu iz primerjalnega preizkusa v repozitoriju (bench/bench.php, tema github-dark), izmerjeni na enem računalniku za datoteke korpusa s približno 55 do 105 vrsticami:

Slovnica PHP 8.2 PHP 8.4
JSON, YAML 30–65 ms 25–45 ms
CSS, HTML 100–120 ms 80–100 ms
Python, Rust, Go, Bash, Markdown 190–220 ms 125–175 ms
PHP približno 290 ms približno 170 ms
TypeScript, TSX 490–510 ms 310–370 ms

Prvi klic za jezik v procesu vključuje tudi enkratno nalaganje in prevajanje slovnice: v istih izvajanjih je to trajalo od 50–70 ms za JSON do malo več kot sekundo za Markdown. Strošek je odvisen od zapletenosti slovnice in velikosti vnosa; ker se rezultati razlikujejo glede na strojno opremo, meritve opravite sami: v klonu repozitorija zaženite composer install in nato composer bench.

Varnostne zaščite

Regex mehanizem vključuje pomnjenje neuspešnih ujemanj in zaščito pred ReDoS, tako da se pri patološkem vzorcu delovanje upočasni, ne pa obesi. Delo na vrstico lahko omejite tudi z tokenizeMaxLineLength, ki za vsako vrstico z določeno dolžino ali več ustvari en sam navadni žeton — zaščita pred zlonamernimi enovrstičnimi vnosi.

Predpomnjenje v produkciji

Zanesljiv način, da označevanje sintakse ne obremenjuje zahtev, je, da ga ne izvajate pri vsaki zahtevi. Označevanje iste kode z istimi možnostmi vedno ustvari isti HTML, zato je predpomnjenje zelo učinkovito:

  • Sintakso označite ob gradnji statičnih mest in dokumentacije.
  • Predpomnite izrisani HTML (ključ sestavljata koda in možnosti) za odrezke, ki jih posredujejo uporabniki ali so shranjeni v zbirki podatkov, in ga znova uporabite, dokler se izvorna koda ne spremeni.

Znotraj procesa znova uporabljajte en sam označevalnik sintakse (za to poskrbi fasada Shikiphp), da si klici delijo predpomnilnike slovnic in tem.