No campo da tecnologia da informação, "otimização de programas" não é apenas um termo, é uma arte que envolve a otimização de todos os aspectos de um sistema de software para maximizar a eficiência, a utilização de recursos e o desempenho relativo ideal. O objetivo da otimização do programa é fazer com que o programa tenha um melhor desempenho em termos de velocidade de execução, uso de memória, etc., e até mesmo atingir menor consumo de energia em alguns casos.
Embora a palavra "otimização" tenha a mesma etimologia de "otimização", na verdade é raro conseguir realmente um sistema ideal.
Muitas vezes, um sistema otimizado não será ideal em sentido absoluto, mas será otimizado com base em medidas de qualidade específicas. Isto significa que em diferentes cenários de aplicação, os métodos de otimização necessários podem ser diferentes. Por exemplo, se o consumo de memória for aumentado para aumentar a velocidade de execução do programa, isto pode não ser totalmente aplicável a todas as situações.
O processo de otimização pode ocorrer em vários níveis, desde o nível de design até escolhas mais específicas de algoritmos e estruturas de dados e, finalmente, até o nível do código-fonte. Diferentes níveis de otimização têm impactos diferentes no produto acabado. Normalmente, quanto maior o nível de otimização, as consequências das alterações serão mais significativas e difíceis de ajustar posteriormente no projeto.
O desempenho faz parte das especificações de um programa: se o programa for lento, ele não será adequado ao propósito.
A otimização no nível do projeto pode envolver o melhor uso dos recursos disponíveis, mas a eficiência também é crítica na escolha de algoritmos e estruturas de dados. Se um design estiver vinculado à latência da rede, você poderá optar por reduzir as solicitações de dados e evitar várias viagens de ida e volta.
Algoritmo eficiente e seleção de estrutura de dados podem afetar significativamente a eficiência geral do programa. Especialmente em programação, as estruturas de dados são frequentemente mais difíceis de alterar do que as funções-membro. Portanto, ao escolher um algoritmo específico, deve-se focar em garantir que sua complexidade de tempo esteja dentro de uma faixa razoável, como constante O(1) ou logarítmico O(log n). Uma pequena mudança, como o uso de técnicas de otimização de "caminho rápido", geralmente resulta em melhorias significativas de desempenho.
No nível específico do código-fonte, certas escolhas também podem causar diferenças significativas de desempenho. Por exemplo, nos primeiros compiladores C, while(1)
teve um desempenho um pouco mais lento que for(;;)
ao inserir um salto condicional, porque o primeiro precisava avaliar a condição. Mas os recursos atuais de otimização de eventos do compilador melhoraram muito.
Programas gerados automaticamente usando um compilador otimizador podem muitas vezes garantir um certo grau de otimização. As escolhas atuais de nível de carga do compilador também podem trazer melhorias de desempenho para seus programas. No entanto, além dos esforços acima, à medida que o limite técnico se tornou mais elevado, os compiladores modernos evoluíram para serem capazes de lidar com códigos relativamente complexos e realizar otimizações.
Em tempo de execução, alguns compiladores geram código de máquina personalizado com base nos dados atuais, o que demonstra as vantagens da tecnologia de compilação just-in-time. Essas tecnologias são capazes de se ajustar com base em informações do mundo real, permitindo uma combinação de flexibilidade e otimização dinâmica. Como resultado, o desempenho melhorará dependendo do ambiente de tempo de execução.
Embora a otimização possa melhorar a eficiência da execução do código, às vezes também aumenta a dificuldade de manutenção, portanto a otimização geralmente é realizada no final da fase de desenvolvimento. Como disse Donald Knuth: "Devemos esquecer as pequenas eficiências e não pensar muito 97% do tempo; mas nos 3% críticos do tempo, não devemos perder oportunidades. Este é um aviso aos desenvolvedores durante a otimização." process , deve equilibrar a estrutura e o desempenho do código.
"A otimização avançada é a raiz de todos os males."
Neste contexto, os programadores de hoje, confrontados com o equilíbrio entre o progresso tecnológico e a eficiência real, como devem escolher o melhor caminho para alcançar o estado mais ideal dos seus códigos de programa?