
# Ydeevne

shikiphp tokeniserer faktisk TextMate i ren PHP, så det er værd at være
ærlig om, hvor den er hurtig, og hvor den ikke er.

## Hvad du kan forvente

Forvent tiere til hundredvis af millisekunder pr. fil, ikke mikrosekunder. Tokenizeren
cachelagrer kompilerede regler og scannere, grammatikker indlæses efter behov (et eksempel,
der aldrig bruger et indlejret sprog, skal ikke betale for at afkode det), og de fleste
grammatikkens mønstre køres gennem native `preg_*` på en PCRE-hurtigsti med kontrolleret ækvivalens,
mens den rene PHP-matcher håndterer resten (se
[Arkitektur](https://shikiphp.inline0.dev/da/docs/architecture#the-scanner-and-its-pcre-fast-path)).

Dette er varme tider for enkeltkald fra projektmappens benchmark
(`bench/bench.php`, tema `github-dark`) på én maskine for korpusfiler med
cirka 55 til 105 linjer:

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

Det første kald for et sprog i en proces betaler også for engangsindlæsning og -kompilering af grammatikken: i de samme kørsler tog det fra 50–70 ms for JSON til lidt over et sekund for Markdown. Omkostningen afhænger af grammatikkens kompleksitet og inputstørrelsen, og tallene varierer med hardwaren, så mål på dit eget system: Kør `composer install` og derefter `composer bench` i en klon af projektmappen.

## Sikkerhedsforanstaltninger

RegEx-motoren indeholder fejlcachelagring og ReDoS-beskyttelse, så et
patologisk mønster gør behandlingen langsommere i stedet for at hænge. Du kan også begrænse arbejdet pr. linje
med [`tokenizeMaxLineLength`](https://shikiphp.inline0.dev/da/docs/options#tokenizemaxlinelength), som udsender ét almindeligt token for enhver linje med mindst en given længde — en beskyttelse mod
ondsindede input på én linje.

## Cachelagring i produktion

Den pålidelige måde at holde fremhævning væk fra din forespørgselssti er **ikke** at køre den
for hver forespørgsel. Fremhævning af den samme kode med de samme indstillinger giver altid
samme HTML, så den egner sig perfekt til cachelagring:

- Fremhæv ved byggetid for statiske websteder og dokumentation.
- Cachelagr det gengivne HTML (med kode og indstillinger som nøgle) for brugerleverede eller
  databasegemte kodestykker, og genbrug det, indtil kilden ændres.

Genbrug én fremhæver i hver proces (`Shikiphp`-facaden gør det for dig), så grammatik- og temacacher deles mellem kald.
