Продуктивність
shikiphp виконує справжню токенізацію TextMate на чистій PHP, тож варто чесно сказати, де він працює швидко, а де — ні.
Чого очікувати
Очікуйте десятки й сотні мілісекунд на файл, а не мікросекунди. Токенізатор кешує скомпільовані правила й сканери, граматики завантажуються за потреби (якщо приклад не використовує вбудовану мову, її навіть не доведеться декодувати), а більшість шаблонів граматик проходить через нативний preg_* шляхом швидкого виконання PCRE з перевіркою еквівалентності; решту обробляє зіставлювач на чистій PHP (див.
Архітектура).
Це час виконання в прогрітому стані для одного виклику з репозиторного тесту продуктивності
(bench/bench.php, тема github-dark), виміряний на одній машині для файлів корпусу
приблизно на 55–105 рядків:
| Граматика | PHP 8.2 | PHP 8.4 |
|---|---|---|
| JSON, YAML | 30–65 мс | 25–45 мс |
| CSS, HTML | 100–120 мс | 80–100 мс |
| Python, Rust, Go, Bash, Markdown | 190–220 мс | 125–175 мс |
| PHP | близько 290 мс | близько 170 мс |
| TypeScript, TSX | 490–510 мс | 310–370 мс |
Перший виклик для мови в процесі також потребує одноразового завантаження й компіляції граматики: у тих самих запусках це тривало від 50–70 мс для JSON до трохи більше секунди для Markdown. Витрати залежать від складності граматики й розміру вхідних даних; результати також змінюються залежно від обладнання, тож виміряйте їх самостійно: клонуйте репозиторій, виконайте composer install, а потім composer bench.
Захист і обмеження
Рушій регулярних виразів використовує кешування невдалих зіставлень і захист від ReDoS, тож патологічний шаблон сповільнює роботу, а не зависає. Також можна обмежити обробку кожного рядка за допомогою tokenizeMaxLineLength: для рядків заданої довжини або довших виводиться один звичайний токен — це захист від зловмисних однорядкових вхідних даних.
Кешування в робочому середовищі
Надійний спосіб не запускати підсвічування під час обробки запиту — не запускати його для кожного запиту. Підсвічування того самого коду з тими самими параметрами завжди дає той самий HTML, тож його легко кешувати:
- Підсвічуйте код під час збирання статичних сайтів і документації.
- Кешуйте відображений HTML (за кодом і параметрами) для фрагментів, які ввели користувачі або які збережено в базі даних, і повторно використовуйте кеш, доки джерело не зміниться.
У межах процесу використовуйте один екземпляр підсвічувача (фасад Shikiphp робить це за вас), щоб кеші граматик і тем були спільними для всіх викликів.