Към съдържанието

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

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

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

Очаквайте десетки до стотици милисекунди на файл, а не микросекунди. Токенизаторът кешира компилираните правила и скенери, граматиките се зареждат при нужда (пример, който не използва вграден език, не плаща цената за декодирането му), а повечето граматични шаблони преминават през нативен preg_* по бързия път PCRE, чиято еквивалентност е проверена, като чистият съпоставител на PHP обработва останалите (вижте Архитектура).

Това са времена за загрял процес при едно извикване от теста за производителност в хранилището (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, което извежда един обикновен токен за всеки ред с дадена дължина или повече — защита срещу злонамерени едноредови входове.

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

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

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

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