Introdução: por que perfilar código Rust?
\n\nRust é conhecido por sua velocidade e segurança, mas mesmo o código mais rápido pode ficar lento se houver gargalos. Perfilamento é o processo de medir o desempenho de um programa: tempo de execução, carga da CPU, memória e outras métricas. Para desenvolvedores iniciantes em Rust, esta é uma habilidade indispensável que permite transformar código "apenas funcional" em código eficiente e rápido.
\n\nImagine que você escreveu um parser de logs ou um jogo em Rust. Tudo compila, mas o programa demora mais do que o esperado. Em vez de adivinhar qual parte do código está lenta, você pode usar profilers que mostram os "pontos quentes" (hotspots) exatos. Neste artigo, abordaremos as principais ferramentas de perfilamento Rust para iniciantes: cargo-flamegraph, perf e medições simples com std::time::Instant.
1. A maneira mais simples: medições de tempo com std::time::Instant
\n\nAntes de passar para ferramentas complexas, aprenda a medir o tempo de execução de partes específicas do código. Este é um método básico, mas eficaz para iniciantes.
\n\nExemplo: medindo o tempo de execução de uma função
\n\nuse std::time::Instant;\n\nfn slow_function() {\n let mut sum = 0u64;\n for i in 0..1_000_000 {\n sum += i;\n }\n println!("Soma: {}", sum);\n}\n\nfn main() {\n let start = Instant::now();\n slow_function();\n let duration = start.elapsed();\n println!("Tempo de execução: {:?}", duration);\n}\n\n\nEste código exibirá o tempo exato de execução de slow_function. No entanto, essa abordagem não é conveniente para projetos grandes: você precisará inserir medições manualmente em cada local suspeito.
Quando isso é útil?
\n- \n
- Você quer verificar rapidamente uma hipótese sobre uma função lenta. \n
- Não é possível instalar ferramentas adicionais. \n
- Você está trabalhando com código single-thread sem lógica complexa. \n
Desvantagem: medições manuais não mostram quanto tempo é gasto dentro de funções chamadas (por exemplo, alocações de memória ou chamadas de sistema). Para isso, são necessários profilers.
\n\n2. Perfilamento com perf (Linux)
\n\nO utilitário perf é um poderoso profiler para Linux que opera no nível do kernel. Ele coleta amostras (samples) de onde o programa gasta tempo. Primeiro, certifique-se de que o perf está instalado:
sudo apt install linux-tools-common linux-tools-generic # Ubuntu/Debian\n\n\nPasso 1: Compilação com informações de depuração
\nPara que o perf possa exibir nomes de funções e linhas de código, compile o projeto em modo debug (ou release com flags debuginfo):
cargo build\n# ou\nRUSTFLAGS="-g" cargo build --release\n\n\nPasso 2: Executando o perfilamento
\nperf record -g ./target/debug/seu_programa\nperf report\n\n\nA flag -g ativa a gravação da pilha de chamadas (call graph). Após executar perf report, você verá uma lista interativa de funções, ordenadas por tempo de execução.
Exemplo de interpretação
\nSuponha que você veja que 70% do tempo é gasto na função Vec::push. Isso pode significar que você está realocando memória com frequência. Solução: alocar a capacidade do vetor antecipadamente com Vec::with_capacity.
Dica: Para iniciantes, o perf pode parecer complexo devido à quantidade de dados. Comece com perf top em tempo real para ver quais funções estão "pegando fogo" no momento.
3. Visualização com cargo-flamegraph
\n\nSe você precisa de uma imagem visual, use cargo-flamegraph. Esta ferramenta cria flamegraphs — gráficos onde a largura do retângulo mostra o tempo de execução da função e a profundidade mostra a