Criterion para Rust: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é Criterion e para que serve?

\n\n

Criterion.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\n

Para que serve o Criterion? Ao contrário de medições simples de tempo com std::time::Instant, o Criterion fornece:

\n
    \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
\n\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
\n\n

Instalação do Criterion em um projeto Rust

\n\n

Ao 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.

\n\n

Você também precisará criar um diretório benches/ na raiz do seu projeto (ao lado de src/).

\n\n

Passo 1: Adicione a dependência no Cargo.toml

\n
[dev-dependencies]\ncriterion = { version = "0.5", features = ["html_reports"] }
\n

Nota: 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.

\n\n

Passo 2: Crie o arquivo de benchmark

\n

Crie o arquivo benches/my_benchmark.rs (o nome pode ser qualquer um).

\n\n

Passo 3: Execute o benchmark

\n
cargo bench
\n

Este comando compilará seu projeto em modo release (com otimizações) e executará todos os benchmarks da pasta benches/.

\n\n

Início rápido: primeiro benchmark

\n\n

Vamos 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\n

O 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
  • <

Recommendations