
# 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](https://shikiphp.inline0.dev/pt/docs/architecture#the-scanner-and-its-pcre-fast-path)).

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`](https://shikiphp.inline0.dev/pt/docs/options#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.
