Přejít k obsahu

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.