Výkon
shikiphp provádí skutečnou tokenizaci TextMate v čistém PHP, proto je dobré uvést, kde je rychlý a kde ne.
Co očekávat
Počítejte s desítkami až stovkami milisekund na soubor, nikoli mikrosekundami. Tokenizátor ukládá zkompilovaná pravidla a skenery do mezipaměti, gramatiky se načítají podle potřeby (ukázka, která nepoužívá vložený jazyk, neplatí za jeho dekódování) a většina vzorů gramatik běží přes nativní preg_* s rychlou cestou PCRE ověřenou z hlediska ekvivalence; o ostatní se stará čistě PHP porovnávač (viz Architektura).
Jde o časy zahřátého jednorázového volání z benchmarku repozitáře
(bench/bench.php, motiv github-dark) na jednom počítači, pro soubory korpusu o
přibližně 55 až 105 řádcích:
| 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 | přibližně 290 ms | přibližně 170 ms |
| TypeScript, TSX | 490–510 ms | 310–370 ms |
První volání jazyka v procesu zahrnuje také jednorázové načtení a kompilaci gramatiky: při stejných bězích to trvalo od 50–70 ms u JSON až po něco přes sekundu u Markdown. Náklady rostou se složitostí gramatiky a velikostí vstupu a výsledky se liší podle hardwaru, proto měřte na vlastním zařízení: v klonu repozitáře spusťte composer install a poté composer bench.
Bezpečnostní ochrana
Regulární výrazový engine zahrnuje ukládání neúspěšných pokusů do mezipaměti a ochranu proti ReDoS, takže patologický vzor výkon zpomalí, ale nezpůsobí zablokování. Práci na řádek můžete také omezit pomocí tokenizeMaxLineLength, která pro každý řádek o dané délce nebo delší vydá jediný prostý token — jde o ochranu proti škodlivým jednořádkovým vstupům.
Ukládání do mezipaměti v produkci
Spolehlivý způsob, jak vyřadit zvýrazňování z cesty požadavku, je nespouštět ho při každém požadavku. Zvýraznění stejného kódu se stejnými možnostmi vždy vytvoří stejný HTML, takže se skvěle hodí k ukládání do mezipaměti:
- Zvýrazňujte při sestavení statických webů a dokumentace.
- Ukládejte vykreslené HTML do mezipaměti (podle kódu a možností) pro úryvky dodané uživateli nebo uložené v databázi a používejte je znovu, dokud se zdroj nezmění.
V rámci procesu používejte opakovaně jeden zvýrazňovač (rozhraní Shikiphp to dělá za vás), aby se mezipaměť gramatik a motivů sdílela mezi voláními.