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.