Vai al contenuto

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

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