Preskočiť na obsah

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.