Pular para o conteúdo

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.