
# Veiktspēja

shikiphp veic īstu TextMate tokenizāciju tīrā PHP, tāpēc ir vērts godīgi paskaidrot, kur tas darbojas ātri un kur ne.

## Ko sagaidīt

Rēķinieties ar desmitiem līdz simtiem milisekunžu katram failam, nevis mikrosekundēm. Tokenizētājs kešatmiņā saglabā kompilētos noteikumus un skenerus, gramatikas tiek ielādētas pēc vajadzības (piemērs, kurā netiek izmantota iegulta valoda, nemaksā par tās dekodēšanu), un lielākā daļa gramatikas paraugu izmanto vietējo `preg_*`, kas ar ekvivalences pārbaudi nodrošina PCRE ātro ceļu; pārējo apstrādā tīrā PHP salīdzinātājs (skatiet [Arhitektūra](https://shikiphp.inline0.dev/lv/docs/architecture#the-scanner-and-its-pcre-fast-path)).

Šie ir iesildīti vienas izsaukšanas mērījumi no repozitorija etalontesta
(`bench/bench.php`, motīvs `github-dark`) vienā datorā, izmantojot korpusa failus ar
aptuveni 55 līdz 105 rindām:

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

Valodas pirmās lietošanas reizē procesā tiek patērēts papildu laiks gramatikas ielādei un kompilēšanai: tajos pašos testos tas bija no 50–70 ms priekš JSON līdz nedaudz vairāk nekā sekundei priekš Markdown. Izmaksas pieaug līdz ar gramatikas sarežģītību un ievades apjomu, un rādītāji atšķiras atkarībā no aparatūras, tāpēc veiciet savus mērījumus: repozitorija klonā palaidiet `composer install` un pēc tam `composer bench`.

## Drošības ierobežojumi

Regulāro izteiksmju dzinējā ir kļūmju memoizācija un aizsardzība pret ReDoS, tāpēc patoloģisks paraugs kļūst lēnāks, nevis iesaldē apstrādi. Varat ierobežot arī katras rindas apstrādi ar [`tokenizeMaxLineLength`](https://shikiphp.inline0.dev/lv/docs/options#tokenizemaxlinelength), kas jebkurai rindai, kura sasniedz vai pārsniedz norādīto garumu, izvada vienu vienkāršu tokenu — aizsardzību pret ļaunprātīgi veidotām garām vienas rindas ievadēm.

## Kešatmiņa produkcijā

Drošākais veids, kā neiekļaut izcelšanu pieprasījuma apstrādes ceļā, ir to **nepalaist** katrā pieprasījumā. Viena un tā paša koda izcelšana ar tām pašām opcijām vienmēr rada vienu un to pašu HTML, tāpēc to var lieliski saglabāt kešatmiņā:

- Veiciet izcelšanu būvēšanas laikā statiskām vietnēm un dokumentācijai.
- Kešatmiņā saglabājiet atveidoto HTML (atslēga ir kods + opcijas) lietotāja vai datubāzē glabātiem fragmentiem un izmantojiet to atkārtoti, līdz mainās avots.

Procesa ietvaros izmantojiet vienu un to pašu izcēlāju (`Shikiphp` fasāde to paveic jūsu vietā), lai gramatiku un motīvu kešatmiņa tiktu koplietota starp izsaukumiem.
