
# Производителност

shikiphp извършва истинска токенизация на TextMate изцяло в PHP, затова е добре
да сме реалистични за това къде е бърз и къде не.

## Какво да очаквате

Очаквайте десетки до стотици милисекунди на файл, а не микросекунди. Токенизаторът кешира компилираните правила и скенери, граматиките се зареждат при нужда (пример, който не използва вграден език, не плаща цената за декодирането му), а повечето граматични шаблони преминават през нативен `preg_*` по бързия път PCRE, чиято еквивалентност е проверена, като чистият съпоставител на PHP обработва останалите (вижте [Архитектура](https://shikiphp.inline0.dev/bg/docs/architecture#the-scanner-and-its-pcre-fast-path)).

Това са времена за загрял процес при едно извикване от теста за производителност в хранилището
(`bench/bench.php`, тема `github-dark`) на една машина за корпусни файлове с
приблизително 55 до 105 реда:

| Граматика | 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 | около 290 ms | около 170 ms |
| TypeScript, TSX | 490–510 ms | 310–370 ms |

Първото извикване на език в даден процес включва и еднократното зареждане и компилиране на граматиката: при същите изпълнения това отнемаше от 50–70 ms за JSON до малко над секунда за Markdown. Разходът се увеличава според сложността на граматиката и размера на входа, а стойностите зависят от хардуера, затова измерете при вас: в клонинг на хранилището изпълнете `composer install`, а след това `composer bench`.

## Защитни механизми

Енджинът за регулярни изрази включва запаметяване на неуспешни опити и защита от ReDoS, така че патологичен шаблон да забавя работата, вместо да я блокира. Можете също да ограничите работата на ред чрез [`tokenizeMaxLineLength`](https://shikiphp.inline0.dev/bg/docs/options#tokenizemaxlinelength), което извежда един обикновен токен за всеки ред с дадена дължина или повече — защита срещу злонамерени едноредови входове.

## Кеширане в продукционна среда

Надеждният начин да не допускате открояването до пътя на заявките е да **не** го изпълнявате при всяка заявка. Открояването на един и същ код със същите опции винаги дава един и същ HTML, затова кеширането му е идеално:

- Откроявайте кода по време на изграждането за статични сайтове и документация.
- Кеширайте визуализирания HTML (с ключ код + опции) за предоставени от потребители или съхранени в база данни откъси и го използвайте повторно, докато изходният код не се промени.

В рамките на един процес използвайте повторно един хайлайтър (фасадата `Shikiphp` го прави вместо вас), така че кешовете на граматиките и темите да се споделят между извикванията.
