Desempenho
shikiphp faz tokenização real TextMate em PHP puro; por isso, vale ser franco sobre onde é rápido e onde não é.
O que esperar
Espere dezenas a centenas de milissegundos por arquivo, não microssegundos. O
||||tokenizador armazena em cache regras e scanners compilados, as gramáticas são carregadas de forma preguiçosa (uma amostra
que nunca usa um idioma incorporado não precisa decodificá-lo), e a maioria dos
padrões de gramática passa pelo preg_* nativo em um caminho rápido PCRE com equivalência verificada,
enquanto o mecanismo de correspondência puro PHP cuida do restante (consulte
Arquitetura).
Estes são tempos aquecidos de uma única chamada, obtidos no benchmark do repositório
(bench/bench.php, tema github-dark) em uma máquina, para arquivos de corpus com
cerca de 55 a 105 linhas:
| Gramática | 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 | cerca de 290 ms | cerca de 170 ms |
| TypeScript, TSX | 490–510 ms | 310–370 ms |
A primeira chamada para um idioma em um processo também inclui o carregamento e a compilação
únicos da gramática: nas mesmas execuções, isso levou de 50–70 ms para JSON a pouco
mais de um segundo para Markdown. O custo varia conforme a complexidade da gramática e o tamanho da entrada,
e os valores mudam de acordo com o hardware; portanto, meça no seu ambiente: em um clone do
repositório, execute composer install e depois composer bench.
Proteções de segurança
O mecanismo de expressões regulares inclui memorização de falhas e proteção contra ReDoS, para que um
padrão patológico degrade o desempenho em vez de travar. Você também pode limitar o trabalho por linha
com tokenizeMaxLineLength, que emite um único token simples para qualquer linha que atinja ou ultrapasse um dado
comprimento — uma proteção contra entradas hostis em uma única linha.
Cache em produção
A forma confiável de evitar que o realce atrase suas requisições é não executá-lo em todas elas. Realçar o mesmo código com as mesmas opções sempre produz o mesmo HTML, então ele pode ser armazenado em cache com perfeição:
- Realce durante a compilação para sites estáticos e documentação.
- Armazene em cache o HTML renderizado (com chave baseada no código + opções) para trechos fornecidos pelo usuário ou armazenados no banco de dados e reutilize-o até que a origem mude.
Dentro de um processo, reutilize um único realçador (a fachada Shikiphp faz isso por
você) para que os caches de gramática e tema sejam compartilhados entre chamadas.