
# Prestanda

shikiphp utför faktisk tokenisering av TextMate i ren PHP, så det är värt att vara
ärlig med vad som går snabbt och vad som inte gör det.

## Vad du kan förvänta dig

Räkna med tiotals till hundratals millisekunder per fil, inte mikrosekunder. Tokeniseraren cachar kompilerade regler och skannrar, grammatiker laddas vid behov (ett kodexempel som aldrig använder ett inbäddat språk kostar inget att avkoda), och de flesta grammatikmönster körs via inbyggd `preg_*` på en PCRE-snabbväg med ekvivalenskontroll, medan den rena PHP-matcharen hanterar resten (se [Arkitektur](https://shikiphp.inline0.dev/sv/docs/architecture#the-scanner-and-its-pcre-fast-path)).

Det här är varma tider för en enskild anropning från arkivets riktmärke
(`bench/bench.php`, tema `github-dark`) på en maskin, för korpusfiler på
ungefär 55 till 105 rader:

| 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örsta anropet för ett språk i en process innebär också en engångskostnad för grammatikladdning
och kompilering: i samma körningar tog det mellan 50–70 ms för JSON och drygt
en sekund för Markdown. Kostnaden beror på grammatikens komplexitet och indatans storlek,
och resultaten varierar med hårdvaran, så mät själv: i en klon av
arkivet kör du `composer install` och sedan `composer bench`.

## Säkerhetsskydd

Regexmotorn har felmemoisering och ReDoS-skydd, så ett patologiskt mönster gör körningen långsammare i stället för att låsa den. Du kan också begränsa arbetet per rad med
[`tokenizeMaxLineLength`](https://shikiphp.inline0.dev/sv/docs/options#tokenizemaxlinelength), som skapar en enda vanlig token för rader som är minst så långa — ett skydd mot illasinnad indata på en enda rad.

## Cachelagring i produktion

Det pålitliga sättet att hålla syntaxmarkeringen borta från anropsvägen är att **inte** köra den
vid varje anrop. Samma kod med samma alternativ ger alltid samma HTML, så den kan cachelagras perfekt:

- Syntaxmarkera vid bygget för statiska webbplatser och dokumentation.
- Cachelagra den renderade HTML (med kod + alternativ som nyckel) för användarinskickade eller
  databaslagrade kodsnuttar och återanvänd resultatet tills källan ändras.

Återanvänd en enda syntaxmarkerare inom en process (`Shikiphp`-fasaden gör det åt
dig), så delas grammatik- och temacacher mellan anrop.
