
# Jõudlus

shikiphp tokeniseerib päriselt TextMate-i koodi puhtas PHP-is, seega tasub ausalt kirjeldada, millal see on kiire ja millal mitte.

## Mida oodata

Arvestage faili kohta kümnete kuni sadade millisekunditega, mitte mikrosekunditega. Tokeniseerija salvestab kompileeritud reeglid ja skannerid vahemällu, grammatikad laaditakse vajaduse korral (näide, mis ei kasuta põimitud keelt, ei pea selle dekodeerimise eest maksma) ning enamik grammatikamustreid läbib samaväärsuskontrolliga PCRE kiire teekonna, kasutades natiivset `preg_*`-i; ülejäänu töötleb puhas PHP-i vasteotsija (vt [Arhitektuur](https://shikiphp.inline0.dev/et/docs/architecture#the-scanner-and-its-pcre-fast-path)).

Need on hoidla võrdlustestist saadud soojad ühe väljakutse ajad (`bench/bench.php`, teema `github-dark`), mõõdetuna ühes masinas ligikaudu 55 kuni 105 reaga korpusefailidel:

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

Protsessis kasutatava keele esimene päring lisab ühekordse grammatika laadimise ja kompileerimise kulu: samades katsetes oli see JSON puhul 50–70 ms ja Markdown puhul veidi üle sekundi. Kulu sõltub grammatika keerukusest ja sisendi suurusest ning ajad erinevad riistvarati, seega mõõtke enda süsteemis: kloonige hoidla, käivitage `composer install` ja seejärel `composer bench`.

## Turvakaitsed

Regulaaravaldiste mootor kasutab tõrgete memoiseerimist ja ReDoS-kaitset, nii et patoloogilise mustri korral jõudlus halveneb, kuid protsess ei jää rippuma. Reatöö mahtu saab piirata ka valikuga [`tokenizeMaxLineLength`](https://shikiphp.inline0.dev/et/docs/options#tokenizemaxlinelength), mis väljastab määratud pikkuse saavutanud või seda ületava rea ühe tavalise tokenina — kaitse pahatahtlike üherealiste sisendite vastu.

## Vahemälu tootmises

Kindlaim viis hoida süntaksi esiletõstmist päringute töötlemisest eemal on seda igal päringul **mitte** käivitada. Sama kood ja samad valikud annavad alati sama HTML, seega sobib see suurepäraselt vahemällu salvestamiseks:

- Tõsta esile kood staatiliste saitide ja dokumentatsiooni koostamise ajal.
- Salvesta renderdatud HTML (võti: kood + valikud) kasutaja antud või andmebaasi salvestatud koodinäidete jaoks vahemällu ning kasuta seda uuesti, kuni lähtekood muutub.

Kasuta protsessi sees üht süntaksi esiletõstjat (`Shikiphp` fassaad teeb seda sinu eest), et grammatika ja teemade vahemälud oleksid väljakutsete vahel ühiskasutuses.
