
# Suorituskyky

shikiphp tokenisoi koodin aidosti TextMate-kielellä puhtaassa PHPssä, joten on hyvä kertoa rehellisesti, missä se on nopea ja missä ei.

## Mitä odottaa

Varaa tiedostoa kohti kymmeniä tai satoja millisekunteja, älä mikrosekunteja. Tokenisoija tallentaa käännetyt säännöt ja skannerit välimuistiin, kieliopit ladataan tarpeen mukaan (näyte, jossa ei käytetä upotettua kieltä, ei maksa sen purkamisesta), ja useimmat kielioppikuviot käsitellään natiivilla `preg_*`llä vastaavuuden varmistavalla PCRE-pikapolulla, kun taas puhdas PHP-täsmääjä hoitaa loput (katso [Arkkitehtuuri](https://shikiphp.inline0.dev/fi/docs/architecture#the-scanner-and-its-pcre-fast-path)).

Nämä ovat lämpimän välimuistin yhden kutsun aikoja projektin vertailuajosta
(`bench/bench.php`, teema `github-dark`) yhdellä koneella, tiedostokorpukselle,
jonka rivien määrä on noin 55–105:

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

Prosessin ensimmäinen kyseisen kielen kutsu sisältää myös kertaluonteisen kieliopin latauksen
ja käännöksen: samoissa ajoissa kesto vaihteli JSONn 50–70 ms:sta hieman yli
sekuntiin Markdownn kohdalla. Kustannus kasvaa kieliopin monimutkaisuuden ja syötteen koon mukaan,
ja luvut vaihtelevat laitteiston mukaan, joten mittaa itse: projektin kloonissa
aja ensin `composer install` ja sitten `composer bench`.

## Turvasuojaukset

Säännöllisten lausekkeiden moottori sisältää virheiden muistiin tallennuksen ja ReDoS-suojauksen,
joten poikkeuksellisen kuvion suoritus hidastuu sen sijaan, että se jumiutuisi. Voit myös rajata rivikohtaista työtä
asetuksella [`tokenizeMaxLineLength`](https://shikiphp.inline0.dev/fi/docs/options#tokenizemaxlinelength), joka tuottaa
yhden tavallisen tokenin vähintään tietyn pituisille riveille — suojaus
haitallisia yksirivisiä syötteitä vastaan.

## Välimuisti tuotannossa

Luotettava tapa pitää korostus poissa pyyntöpolulta on olla suorittamatta sitä
jokaisella pyynnöllä. Saman koodin korostus samoilla asetuksilla tuottaa aina saman HTMLn,
joten sen voi tallentaa täydellisesti välimuistiin:

- Korosta koodi rakennusvaiheessa staattisilla sivustoilla ja dokumentaatiossa.
- Tallenna renderöity HTML välimuistiin (avaimena koodi + asetukset) käyttäjän antamia tai
  tietokantaan tallennettuja katkelmia varten ja käytä sitä uudelleen lähteen muuttumiseen asti.

Käytä prosessin sisällä samaa korostinta uudelleen (`Shikiphp`-rajapinta tekee tämän puolestasi),
jotta kielioppi- ja teemavälimuistit jakautuvat kutsujen kesken.
