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