O que é Criterion e para que serve?
\n\nCriterion.rs é uma biblioteca poderosa e flexível para benchmarking (testes de desempenho) na linguagem Rust. É um análogo direto da popular biblioteca Criterion para Haskell, mas adaptada ao ecossistema Rust.
\n\nPara que serve o Criterion? Ao contrário de medições simples de tempo com std::time::Instant, o Criterion fornece:
- \n
- Análise estatística: Executa automaticamente o código muitas vezes, coleta uma amostra do tempo de execução e calcula média, mediana, desvio padrão e percentis. \n
- Comparação com referência: Permite comparar o desempenho da versão atual do código com a anterior (teste de regressão). \n
- Geração de relatórios: Cria belos relatórios HTML com gráficos e tabelas. \n
- Benchmarking paramétrico: Testa facilmente o desempenho de uma função com diferentes dados de entrada. \n
- Resistência a ruído: Os algoritmos do Criterion são resistentes a flutuações no tempo de execução causadas por processos de fundo do SO. \n
A biblioteca é indispensável para desenvolvedores que desejam:
\n- \n
- Otimizar partes críticas do código. \n
- Garantir que o novo código não desacelere a funcionalidade antiga. \n
- Tomar decisões baseadas em dados, e não em suposições. \n
Instalação do Criterion em um projeto Rust
\n\nAo contrário do Python (pip) ou Node.js (npm), no Rust a instalação de bibliotecas é feita através do gerenciador de pacotes Cargo. Criterion não é uma biblioteca para o código principal, mas uma ferramenta de teste, portanto é adicionada na seção [dev-dependencies] do arquivo Cargo.toml.
Você também precisará criar um diretório benches/ na raiz do seu projeto (ao lado de src/).
Passo 1: Adicione a dependência no Cargo.toml
\n[dev-dependencies]\ncriterion = { version = "0.5", features = ["html_reports"] }\nNota: A flag features = ["html_reports"] ativa a geração de relatórios HTML. Sem ela, apenas saídas de texto no console serão exibidas.
Passo 2: Crie o arquivo de benchmark
\nCrie o arquivo benches/my_benchmark.rs (o nome pode ser qualquer um).
Passo 3: Execute o benchmark
\ncargo bench\nEste comando compilará seu projeto em modo release (com otimizações) e executará todos os benchmarks da pasta benches/.
Início rápido: primeiro benchmark
\n\nVamos escrever um benchmark simples que mede a velocidade da soma de números de 0 a 99.
\n\n// benches/my_benchmark.rs\nuse criterion::{black_box, criterion_group, criterion_main, Criterion};\n\n// Função que vamos testar\nfn sum_slow(n: u64) -> u64 {\n let mut sum = 0;\n for i in 0..n {\n sum += i;\n }\n sum\n}\n\nfn sum_fast(n: u64) -> u64 {\n n * (n - 1) / 2\n}\n\nfn criterion_benchmark(c: &mut Criterion) {\n // Agrupando os benchmarks\n let mut group = c.benchmark_group("sum_comparison");\n \n group.bench_function("slow", |b| b.iter(|| sum_slow(black_box(100))));\n group.bench_function("fast", |b| b.iter(|| sum_fast(black_box(100))));\n \n group.finish();\n}\n\n// Macros para registro e execução\ncriterion_group!(benches, criterion_benchmark);\ncriterion_main!(benches);\n\nO que está acontecendo aqui?
\n- \n
black_box()— informa ao compilador que o valor deve ser passado "como está", prevenindo otimizações prematuras (o compilador pode calcular a constante em tempo de compilação, distorcendo o resultado). \n b.iter()— o loop principal do benchmark. O Criterion chamará este closure muitas vezes e medirá o tempo. \n - <
Também na biblioteca
JsonWebToken para JavaScript (Node.js): guia completo com exemplos
Event Bus e padrão Observer em C++: implementação em C++ moderno