Hoppa till innehåll

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.