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

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