Ga naar de inhoud

Prestaties

shikiphp voert echte tokenisering van TextMate uit in pure PHP, dus het is goed om eerlijk te zijn over wat snel gaat en wat niet.

Wat u kunt verwachten

Reken op tientallen tot honderden milliseconden per bestand, geen microseconden. De tokenizer slaat gecompileerde regels en scanners op in de cache, grammatica's worden op verzoek geladen (een voorbeeld dat nooit een ingesloten taal gebruikt, hoeft die niet te decoderen), en de meeste grammaticapatronen lopen via native preg_* met een op equivalentie getoetst PCRE-snelpad; de pure-PHP-matcher verwerkt de rest (zie Architectuur).

Dit zijn warme tijden voor één aanroep, afkomstig van de benchmark van de repository (bench/bench.php, thema github-dark) op één machine, voor corpusbestanden van ongeveer 55 tot 105 regels:

Grammatica 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 ongeveer 290 ms ongeveer 170 ms
TypeScript, TSX 490–510 ms 310–370 ms

De eerste aanroep voor een taal in een proces brengt ook eenmalige kosten voor het laden en compileren van de grammatica met zich mee: in dezelfde uitvoeringen varieerden die van 50–70 ms voor JSON tot iets meer dan een seconde voor Markdown. De kosten hangen af van de complexiteit van de grammatica en de invoergrootte. De cijfers variëren per hardware, dus meet ze zelf: kloon de repository en voer composer install en daarna composer bench uit.

Veiligheidsmaatregelen

De regex-engine bevat memoïsering bij fouten en bescherming tegen ReDoS, zodat een pathologisch patroon vertraagt in plaats van vast te lopen. U kunt het werk per regel ook begrenzen met tokenizeMaxLineLength. Voor regels die minstens een bepaalde lengte hebben, wordt dan één platte token gegenereerd — een bescherming tegen kwaadwillige invoer op één regel.

Caching in productie

De betrouwbare manier om markeren buiten het verzoekpad te houden, is door het niet bij elk verzoek uit te voeren. Dezelfde code met dezelfde opties markeren levert altijd dezelfde HTML op, dus die kan perfect worden gecachet:

  • Markeer tijdens het bouwen voor statische sites en documentatie.
  • Cache de gerenderde HTML (op basis van code + opties) voor door gebruikers aangeleverde of in een database opgeslagen fragmenten, en hergebruik die totdat de bron verandert.

Gebruik binnen één proces steeds dezelfde highlighter (de Shikiphp-facade doet dit voor u), zodat grammaticacaches en themacaches tussen aanroepen worden gedeeld.