
# Prestazioni

shikiphp esegue una vera tokenizzazione TextMate in PHP puro, quindi è bene
chiarire dove è veloce e dove no.

## Cosa aspettarsi

Aspettatevi da decine a centinaia di millisecondi per file, non microsecondi. Il
tokenizer memorizza nella cache le regole compilate e gli scanner, le grammatiche vengono caricate in modo differito (un esempio che non usa mai una lingua incorporata non deve decodificarla) e la maggior parte dei pattern grammaticali passa dal percorso accelerato PCRE nativo `preg_*`, la cui equivalenza è verificata, mentre il matcher PHP puro gestisce il resto (consultate
[Architettura](https://shikiphp.inline0.dev/it/docs/architecture#the-scanner-and-its-pcre-fast-path)).

Sono tempi a regime per una singola chiamata, misurati con il benchmark del repository
(`bench/bench.php`, tema `github-dark`) su una macchina, per file corpus di
circa 55–105 righe:

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

La prima chiamata per una lingua in un processo comporta anche il caricamento e la compilazione una tantum della grammatica: nelle stesse esecuzioni, il tempo variava da 50–70 ms per JSON a poco più di un secondo per Markdown. Il costo cresce con la complessità della grammatica e le dimensioni dell'input; i valori cambiano in base all'hardware, quindi misurateli nel vostro ambiente: clonate il repository, eseguite `composer install` e poi `composer bench`.

## Protezioni di sicurezza

Il motore regex include la memorizzazione degli errori nella cache e protezioni ReDoS, così un pattern patologico rallenta invece di bloccarsi. Potete anche limitare il lavoro per riga con
[`tokenizeMaxLineLength`](https://shikiphp.inline0.dev/it/docs/options#tokenizemaxlinelength), che genera un unico token di testo semplice per ogni riga di lunghezza pari o superiore al limite, proteggendo da input ostili su una sola riga.

## Cache in produzione

Il modo affidabile per evitare che l'evidenziazione rallenti le richieste è **non** eseguirla a ogni richiesta. Evidenziare lo stesso codice con le stesse opzioni produce sempre lo stesso HTML, quindi si presta perfettamente alla memorizzazione nella cache:

- Eseguite l'evidenziazione in fase di build per siti statici e documentazione.
- Memorizzate nella cache l'HTML renderizzato (con codice + opzioni come chiave) per gli snippet forniti dagli utenti o salvati nel database e riutilizzatelo finché la sorgente non cambia.

All'interno di un processo, riutilizzate un unico highlighter (la facciata `Shikiphp` lo fa per voi) così le cache di grammatiche e temi sono condivise tra le chiamate.
