Performanță
shikiphp tokenizează efectiv TextMate în PHP pur, așa că merită să fim onești în privința situațiilor în care este rapid și a celor în care nu este.
La ce să vă așteptați
Așteptați-vă la zeci sau sute de milisecunde per fișier, nu la microsecunde. Tokenizatorul memorează regulile și scanerele compilate, gramaticile se încarcă la cerere (un eșantion care nu folosește niciodată o limbă inclusă nu plătește costul decodării ei), iar majoritatea modelelor gramaticale folosesc preg_* nativ pe o cale rapidă PCRE cu echivalență verificată, iar restul sunt gestionate de motorul de potrivire pur PHP (consultați Arhitectura).
Acestea sunt timpi de execuție la cald, pentru un singur apel, din benchmarkul
repository-ului (bench/bench.php, tema github-dark), rulat pe o singură mașină, pentru fișiere de corpus cu
aproximativ 55 până la 105 de linii:
| Gramatică | 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 | aproximativ 290 ms | aproximativ 170 ms |
| TypeScript, TSX | 490–510 ms | 310–370 ms |
La prima apelare a unei limbi într-un proces se adaugă și costul unic al încărcării și compilării gramaticii: în aceleași rulări, durata a variat de la 50–70 ms pentru JSON până la puțin peste o secundă pentru Markdown. Costul depinde de complexitatea gramaticii și de dimensiunea intrării, iar valorile variază în funcție de hardware, așa că măsurați pe propriul sistem: într-o clonă a depozitului, rulați composer install și apoi composer bench.
Măsuri de protecție
Motorul regex include memorarea eșecurilor și protecție ReDoS, astfel încât un
model patologic degradează performanța în loc să blocheze execuția. Puteți limita și volumul de lucru pe linie
cu tokenizeMaxLineLength, care emite un singur token simplu pentru orice linie care atinge sau depășește o anumită lungime — o măsură de protecție împotriva intrărilor ostile pe o singură linie.
Memorarea în cache în producție
Metoda sigură de a nu include evidențierea în fluxul cererii este să nu o rulați la fiecare cerere. Evidențierea aceluiași cod cu aceleași opțiuni produce întotdeauna același HTML, deci rezultatul poate fi memorat perfect în cache:
- Efectuați evidențierea la compilare pentru site-uri statice și documentație.
- Memorați în cache HTML redat (cheia fiind codul + opțiunile) pentru fragmentele furnizate de utilizatori sau stocate în baza de date și reutilizați-l până când se modifică sursa.
În cadrul unui proces, reutilizați un singur highlighter (fațada Shikiphp face acest lucru
pentru dvs.), astfel încât cache-urile gramaticilor și temelor să fie partajate între apeluri.