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).
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, 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.