Geralmente negligenciado pelos desenvolvedores devido a:
- Falta de experiência
- Crença na alta capacidade da plataforma subjacente
- Postergação para etapas posteriores ao desenvolvimento propriamente dito
- Inerente complexidade e controvérsia
- Antendimento preciso e satisfatório a requisitos funcionais e não funcionais
- projeto estrutural e comportamental
- implementação e/ou escolha de estruturas de dados e algoritmos
- interaçãoes com a plataforma (hardware + SO) subjacente
- questões de compilação e execução
É o processo de modificação de um sistema de software para torná-lo mais eficiente ou utilizar menos recursos em algum aspecto. Em geral, um programa de compudator deve ser otimizado de forma que execute mais rapidamente, ou que seja capaz de operar com uma utilização menor de memória ou outros recursos, ou diminuir o uso da bateria.
De maneira geral, uma otimização incui identificar possíveis ou reais gargalos no sistema que estejam prejudicando seu desempenho e tentar desfazê-los
- Pode ocorrer em diversos níveis
- Em projetos de maior longevidade, pode ser realizada em ciclos
- Se muito postergada, pode incorrer em mudanças significativas ou mesmo uma reescrita completa do código (nem sempre pode ser alcançada nas fases finais do desenvolvimento)
- Arquitetura e projeto detalhado
- Algoritmos e estruturas de dados
- Código fonte
- Construção (building)
- Compilação
- Montagem (assembly)
- Execução (otimização dinamica)
- Reduzir linhas de código em linguagem de programação de alto nível -> otimiza
- Algumas operações são provavelmente mais rápidas que outras
- A otimização deve ser feita durante a codificação
- Um programa rápido é tão importante quanto um programa correto
- Problemas de desempenho são raros
- Recursos computacionais são de fácil e barata aquisição
- Dá muito trabalho fazer otimização
- Dá pra otimizar depois
Otimizar um programa pode
- Tornar sua compreensão mais complicada
- Torná-lo propenso a erros
- Reduzir manutenibilidade
- Prejudicar outros aspectos de qualidade
- Ser algo muito prematuro
- Representar uma tarefa não trivial por demandar uma análise precisa de desempenho
- Fazer um backup da versão atual do programa
- Realizar medições para identificar gargalos de desempenho
- Determinar a causa do problema de desempenho
- Planejar como a otimização será feita e verificar eventuais efeitos
- Realizar as modificações necessárias
- Realizar novas medições para verificar se o gargalo foi resolvido
- Identificar se as modificações não foram mais prejudiciais que benéficas
- Realizar testes para verificar se n foram introduzidos bugs
- As técnicas de otimização de código focam em ganhos de desempenho, que podem ser alcançados mediante modificações no código fonte
- A otimização de código diz respeito a alterações de menor escala, não a alterações de projeto, de maior impacto
- Manipulação lógica de estuturas condicionais e de repetição
- Aglomeração ou desdobramento de laços (em laços aninhados, o laço executado mais vezes deve ser o mais interno)
- Transformações de dados (tipos adequados ao domínio, tipagem de acordo com a utilização real, evitando castings)
- O desempenho é apenas um aspecto da qualidade geral do software, mas geralmente não é o mais importante.
- Realizar medições quantitativas é fundamental para endereçar a questão de desempenho
- Normalmente são necessárias múltiplas iterações para de obter as melhorias de desempenho desejadas por meio da otimização de código
- A melhor maneira de se preparar para o trabalho de otimização durante a codificação inicial é escrever um código claro, compreensível e de fácil manutenibilidade