Výkon
shikiphp vykonáva skutočnú tokenizáciu TextMate v čistom PHP, preto je vhodné otvorene hovoriť o tom, kedy je rýchly a kedy nie.
Čo môžete očakávať
Počítajte s desiatkami až stovkami milisekúnd na súbor, nie s mikrosekundami. Tokenizátor ukladá skompilované pravidlá a skenery do vyrovnávacej pamäte, gramatiky načítava podľa potreby (ukážka, ktorá nepoužíva vložený jazyk, neplatí za jeho dekódovanie) a väčšina vzorov gramatík sa spracúva cez natívne preg_* na rýchlej ceste PCRE overenej z hľadiska ekvivalencie; o zvyšok sa stará porovnávač PHP (pozrite si Architektúra).
Ide o časy zahriatej vyrovnávacej pamäte pri jednom volaní z benchmarku repozitára (bench/bench.php, téma github-dark) na jednom stroji, pre súbory korpusu s približne 55 až 105 riadkami:
| Gramatika | 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žne 290 ms | približne 170 ms |
| TypeScript, TSX | 490–510 ms | 310–370 ms |
Prvé použitie jazyka v procese zahŕňa aj jednorazové načítanie a kompiláciu gramatiky: v rovnakých meraniach to trvalo od 50–70 ms pri JSON až po niečo vyše sekundy pri Markdown. Náklady rastú so zložitosťou gramatiky a veľkosťou vstupu a výsledky sa líšia podľa hardvéru, preto merajte na vlastnom stroji: v klone repozitára spustite composer install a potom composer bench.
Bezpečnostné poistky
Regexové jadro obsahuje zapamätávanie zlyhaní a ochranu pred ReDoS, takže patologický vzor znižuje výkon namiesto toho, aby proces zablokoval. Prácu na riadok môžete obmedziť aj pomocou tokenizeMaxLineLength, ktoré pre každý riadok dosahujúci zadanú dĺžku alebo ju presahujúcu vypíše jeden obyčajný token — ide o ochranu pred útočnými jednoriadkovými vstupmi.
Ukladanie do vyrovnávacej pamäte v produkcii
Spoľahlivý spôsob, ako odstrániť zvýrazňovanie z cesty požiadavky, je nespúšťať ho pri každej požiadavke. Zvýraznenie rovnakého kódu s rovnakými možnosťami vždy vytvorí rovnaký HTML, preto sa výborne ukladá do vyrovnávacej pamäte:
- Zvýrazňujte pri zostavovaní statických webov a dokumentácie.
- Vykreslený HTML (s kľúčom podľa kódu a možností) ukladajte do vyrovnávacej pamäte pre úryvky dodané používateľmi alebo uložené v databáze a opätovne ho používajte, kým sa zdroj nezmení.
V rámci procesu opakovane používajte jeden zvýrazňovač (fasáda Shikiphp to robí za vás), aby sa vyrovnávacia pamäť gramatík a tém zdieľala medzi volaniami.