Pāriet uz saturu

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

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