
# 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](https://shikiphp.inline0.dev/sk/docs/architecture#the-scanner-and-its-pcre-fast-path)).

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`](https://shikiphp.inline0.dev/sk/docs/options#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.
