1. Evitar Otimização Prematura
Principais máximas:
- Muitas vezes, o desempenho é sacrificado em nome de otimizações desnecessárias.
- Otimização prematura é considerada a "raiz de todo o mal" na programação.
As regras recomendadas são:
- Regra 1: Não otimize.
- Regra 2: Só otimize quando a necessidade estiver clara e inevitável.
2. Foque na Arquitetura de Código Clara e Correta
- Objetivo inicial: Crie programas bem-estruturados e de fácil manutenção antes de focar em desempenho.
- Se a base arquitetural estiver sólida, otimizações podem ser adicionadas posteriormente sem comprometer a integridade do código.
- Encapsulamento: Utilize a ocultação de informações para isolar as escolhas de design, facilitando mudanças e melhorias locais sem impactar o sistema como um todo.
3. Considere o Desempenho no Design Inicial, mas Evite Compromissos Prematuros
- Durante o design, evite escolhas que restrinjam o desempenho futuro, especialmente em:
- APIs: Certifique-se de que métodos críticos não adicionem penalidades de desempenho, como a criação de objetos desnecessários.
- Formatação de dados persistentes: Escolha formatos de dados que permitam flexibilidade e eficiência.
- Exemplo de API ineficiente: O método getSize da classe java.awt.Component retorna um objeto Dimension mutável, exigindo alocações desnecessárias e impactando o desempenho.
4. Avalie Desempenho com Ferramentas Adequadas (Profiling e Benchmarking)
- Profilers: Use ferramentas de profiling para identificar onde o programa consome mais tempo, evitando otimizar partes que não são o verdadeiro gargalo.
- Exemplo de ferramenta: jmh (Java Microbenchmark Harness) é recomendado para micro-benchmarking de desempenho detalhado em Java.
- O profiling ajuda a identificar algoritmos ineficientes (por exemplo, quadráticos) que devem ser substituídos por algoritmos mais eficientes antes de focar em melhorias de baixo nível.
5. Considerar Portabilidade e Variabilidade de Desempenho em Diferentes
- Implementações e Hardware
- O desempenho em Java pode variar amplamente entre versões de JVM, plataformas de hardware e configurações.
- É importante verificar as otimizações em todas as plataformas de destino para garantir a consistência do desempenho.
6. Processo de Otimização Pós-Desenvolvimento
Passos recomendados:
- Finalize o design e implemente uma versão clara e concisa do programa.
- Avalie o desempenho geral. Se necessário, localize e otimize as áreas que mais afetam a performance.
- Priorize a escolha de algoritmos eficientes; uma escolha inadequada de algoritmo não é resolvida com otimizações de baixo nível.
- Meça o desempenho após cada ajuste para confirmar o impacto positivo.
Resumo Final
- Boa prática: Concentre-se em escrever código de qualidade, pois um bom design é geralmente compatível com um desempenho eficiente.
- Avaliação constante: Sempre meça o impacto das otimizações no desempenho.
- Exemplo geral: Quando métodos críticos impactam a eficiência devido a objetos desnecessários, considere alternativas como tipos imutáveis ou métodos que retornam valores primitivos em vez de objetos, reduzindo alocações e tornando o programa mais rápido e eficiente.
Top comments (0)