Boas Práticas de Desempenho
Otimize apenas o caminho crítico medido. Rust oferece abstrações de custo zero, mas a disciplina em alocações, profiling e configurações de release ainda é fundamental na produção.
Como Usar Esta Lista
- Aplique antes de um trabalho significativo de desempenho ou após incidentes de latência (SEVs).
- Combine com Benchmarking & Profiling para ferramentas.
- Exija evidências de benchmark ou perfil nas descrições de PRs de desempenho.
A - Medir
- Faça benchmark e profile binários de release. Nunca otimize builds de debug para SLOs de produção.
- Estabeleça métricas de linha de base antes das alterações. Criterion ou APM p50/p99 documentados no PR.
- Use cargas de trabalho representativas. Formas de consulta reais, tamanhos de payload, níveis de concorrência.
- Separe gargalos de CPU vs. I/O. Perfis vazios quando se espera por rede/DB.
- Reavalie após cada alteração. Uma alteração por vez.
B - Código do Caminho Crítico
- Use empréstimos (borrow) antes de clonar em loops internos.
&str,&[T],Cownas fronteiras. - Pré-aloque
Vec/Stringcomwith_capacity. Tamanhos conhecidos a partir de metadados de entrada. - Prefira iteradores até que o perfil indique um loop. Abstrações de custo zero são reais em release.
- Evite
Box<dyn>e dispatch dinâmico em caminhos críticos. Use enums ou genéricos. - Agrupe I/O e viagens de ida e volta ao banco de dados. Consultas N+1 dominam muitas APIs Rust.
C - Serviços Assíncronos
- Nunca bloqueie threads de worker do Tokio. Use
spawn_blockingpara CPU/IO síncrono. - Limite tarefas concorrentes com semáforos. Proteja o banco de dados e APIs upstream.
- Use spans de
tracingnas fronteiras dos manipuladores. Encontre awaits lentos em produção. - Pool de conexões dimensionado a partir de testes de carga. Pool sqlx não ilimitado.
- Defina timeout para todas as chamadas externas. Evite acúmulo sob lentidão.
D - Compilação e Implantação
- Perfil de release:
opt-level = 3, LTO fino,codegen-units = 1para servidores. Ajuste com dados. - Remova símbolos em artefatos enviados; mantenha informações de debug separadamente, se necessário. Simbolização de crash.
- Desabilite features de crates não utilizadas em todo o workspace. Binários menores e compilações mais rápidas.
- Fixe
target-cpuna linha de base de implantação. Nãonativea menos que o hardware seja uniforme. - Acompanhe o tamanho do binário em releases CLI/WASM. Use
cargo bloatna lista de verificação de release.
E - Dados e Bibliotecas
- Use consultas lazy do Polars; evite
collect()prematuro. Polars 0.46+ vetoriza quando possível. - Faça streaming de CSV/Parquet grandes em vez de carregar tudo. Limites de memória e caudas de latência.
- serde empresta do buffer de entrada ao analisar. Use
#[serde(borrow)]em campos&str. - Escolha
HashMapvsBTreeMapdeliberadamente. Trocas entre cache e ordenação. - Use SIMD apenas após o perfil da linha de base escalar. O custo da complexidade é real.
FAQs
Quando a otimização prematura é aceitável?
Padrões anti-conhecidos (clonar por linha em loop apertado) sem perfil; ainda verifique após a correção.
Orçamento de desempenho no template de PR?
Sim: números antes/depois ou uma caixa de seleção "sem alteração no caminho crítico".
Quem é responsável por regressões de desempenho?
O autor da alteração, a menos que a plataforma forneça suporte de profiling.
Criterion no CI?
Opcional em um runner dedicado; armazene linhas de base para crates críticos.
Polars vs loops manuais?
Use Polars para análise; recorra a loops Rust apenas para operações personalizadas que o Polars não possui.
Como lidar com débito técnico de desempenho?
Crie um ticket com o perfil anexado; priorize pelo impacto no SLO.
Compensação entre memória e CPU?
Documente a escolha; servidores geralmente trocam MB por latência se a RAM for barata.
Teste de carga antes de enviar?
Sim para APIs voltadas para o usuário; a velocidade do Rust não corrige N+1 arquitetural.
Profile em staging?
Espelhe o volume de dados de produção anonimizado; micro-benchmarks sintéticos são insuficientes sozinhos.
Quando parar de otimizar?
Quando o SLO for atendido com margem; invista em observabilidade em vez de micro-otimizações.
Relacionados
- Noções Básicas de Desempenho - introdução
- 30 Regras de Desempenho - regras rápidas
- Ajuste de Release - flags de perfil
- Evitando Clones - propriedade
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.