
# Našumas

shikiphp iš tikrųjų žetonizuoja TextMate naudodamas gryną PHP, todėl verta aiškiai pasakyti, kur jis veikia sparčiai, o kur — ne.

## Ko tikėtis

Tikėkitės, kad vienai rinkmenai prireiks dešimčių ar šimtų milisekundžių, o ne mikrosekundžių. Žetonizatorius išsaugo sukompiliuotas taisykles ir analizatorius talpykloje, gramatikos įkeliamos prireikus (jei pavyzdyje nėra įterptosios kalbos, nereikės gaišti laiko jos iškodavimui), o dauguma gramatikos šablonų apdorojami savajame `preg_*` lygiaverčių rezultatų patikra apribotame PCRE sparčiajame kelyje; likusius apdoroja grynas PHP palyginimo mechanizmas (žr. [Architektūra](https://shikiphp.inline0.dev/lt/docs/architecture#the-scanner-and-its-pcre-fast-path)).

Tai šilti vieno iškvietimo laikai iš saugyklos našumo bandymo (`bench/bench.php`, tema `github-dark`), atlikto viename kompiuteryje su maždaug 55–105 eilučių rinkinio rinkmenomis:

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

Pirmą kartą naudojant kalbą procese, vienąkart sugaištama gramatikai įkelti ir sukompiliuoti: tų pačių bandymų metu tai truko nuo 50–70 ms su JSON iki kiek daugiau nei sekundę su Markdown. Trukmė priklauso nuo gramatikos sudėtingumo ir įvesties dydžio, o rezultatai kinta pagal įrangą, todėl išmatuokite patys: saugyklos kopijoje paleiskite `composer install`, tada `composer bench`.

## Saugos apsaugos priemonės

Reguliariųjų išraiškų variklis įsimena nesėkmes ir saugo nuo ReDoS atakų, todėl apdorojimas pagal patologinį šabloną sulėtėja, o ne užstringa. Taip pat galite apriboti kiekvienos eilutės apdorojimo darbą naudodami [`tokenizeMaxLineLength`](https://shikiphp.inline0.dev/lt/docs/options#tokenizemaxlinelength); tada bet kokio ilgio ribą pasiekusiai ar ją viršijusiai eilutei pateikiamas vienas paprastas žetonas — apsauga nuo kenkėjiškų vienos eilutės įvesčių.

## Talpykla produkcinėje aplinkoje

Patikimiausias būdas neįtraukti paryškinimo į užklausos apdorojimą — jo **nevykdyti** kiekvienos užklausos metu. Tas pats kodas su tomis pačiomis parinktimis visada duoda tą patį HTML, todėl jį puikiai galima laikyti talpykloje:

- Paryškinkite kodą kūrimo metu statinėms svetainėms ir dokumentacijai.
- Atvaizduotą HTML (raktas: kodas + parinktys) laikykite talpykloje naudotojų pateiktiems ar duomenų bazėje saugomiems fragmentams ir naudokite pakartotinai, kol pasikeis pradinis kodas.

Procese pakartotinai naudokite vieną paryškintuvą (`Shikiphp` fasadas tai padaro už jus), kad gramatikų ir temų talpyklos būtų bendrinamos tarp iškvietimų.
