Item 67: Seja criterioso ao otimizar

javaefetivo

Java Efetivo (livro)

Posted on October 31, 2024

Item 67: Seja criterioso ao otimizar

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.
💖 💪 🙅 🚩
javaefetivo
Java Efetivo (livro)

Posted on October 31, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related