Perfilando código Rust: encontrando gargalos para iniciantes

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

Introdução: por que perfilar código Rust?

\n\n

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

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

\n\n

1. A maneira mais simples: medições de tempo com std::time::Instant

\n\n

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

Exemplo: medindo o tempo de execução de uma função

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

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

\n\n

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

2. Perfilamento com perf (Linux)

\n\n

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

\n\n
sudo apt install linux-tools-common linux-tools-generic  # Ubuntu/Debian\n
\n\n

Passo 1: Compilação com informações de depuração

\n

Para 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):

\n\n
cargo build\n# ou\nRUSTFLAGS="-g" cargo build --release\n
\n\n

Passo 2: Executando o perfilamento

\n
perf record -g ./target/debug/seu_programa\nperf report\n
\n\n

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

\n\n

Exemplo de interpretação

\n

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

\n\n

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.

\n\n

3. Visualização com cargo-flamegraph

\n\n

Se 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

Blogs

Book Recommendations