ViniGodoy wrote:Trabalhei por 9 anos com sistema de tempo real, onde a performance é crítica. Aqui vão algumas dicas de performance:
1. Fuja dos mitos! Procure artigos sérios, de profissionais da área sobre performance (como os do
Goetz, no caso do Java). Muitos mitos vão fazer você ter comportamento ridículo, como declarar final em tudo, usar métodos estáticos em todo lugar, ou achar muito importante usar ++i no lugar de i++ no Java.
2. Lembre-se que otimização custa caro, tanto para se desenvolver, quanto para manter o código depois. Portanto, otimize apenas quando for estritamente necessário;
3. Use um profiler para identificar onde otimizar (bons profilers são a VisualVM e o profiler do Netbeans). Geralmente os problemas de performance estão em pequenos gargalos, e são eles que devem ser otimizados.
4. Use um profiler, para saber se sua modificação realmente surtiu efeito. Se não surtiu, desfaça a modificação.
5. Quando o assunto for otimização, nunca queime uma dessas etapas:
a) Você precisa de um código
eficaz: Seu código ainda não faz o que tem que fazer? Então não é hora de otimizar. Aproveite essa etapa para montar uma sólida bateria de testes unitários, se possível.
b) Torne seu código
eficiente: Muito provavelmente, os primeiros problemas de performance serão erros bobos. Um algoritmo errado, uma estrutura de dados errada, uma operação feita no momento errado, etc. Simplesmente corrija esse problema e substitua algoritmos por outros melhores, sem perder flexibilidade ou legibilidade do seu código.
c) Torne seu código
especializado: Ou seja, veja se não há possibilidades de otimização para seu problema em especial. Inclui: descartar processamento de dados desnecessários, fazer caching de dados comumente usados, usar algoritmos específicos para o problema. Um exemplo clássico é o algoritmo A* para processamento de mapas. Ele funciona desde que você possa estimar que direção seguir (o que não é o caso para mapas com teletransporte).
d) Torne seu código
específico: Seu código agora passará a ser dependente de um determinado hardware ou SO. Inclui otimizações sinistras específicas de plataforma ou uso de hardware específico.
Note que queimar etapas é prejudicial pois quanto mais você avança, mais específico seu código se torna, mais tempo você levará para desenvolver e mais caro ele se tornará. Depois de cruzar a letra b), cuidado! Mudanças de condição no ambiente poderão afetar o seu programa.
6. Aprenda estruturas de dados, e saiba quando usa-las em cada caso.
7. Conheça bem as tecnologias que está trabalhando, e procure seguir as recomendações de quem às produz. Um exemplo disso, no Java, é usar StringBuilder no lugar de concatenação de Strings, ArrayList no lugar de Vector. No C++ é evitar o lançamento de exceptions. Leia atentamente a documentação e entenda o que está fazendo, ao invés de só copiar e colar exemplos da internet (essa dica vale não só para performance);
8. Tente procurar APIs específicas para seu problema, e avalia-las. Redesenvolver para obter mais performance entra na alternativa c), dos passos ali em cima.
É importante entender que performance é um conceito relativo. Ou seja, procure definir parâmetros reais e mensuráveis do quão rápido o código deve ser. Numa aplicação web, por exemplo, os tempos de resposta geralmente podem ser muito altos, diferentes de uma aplicação feita para uma injeção eletrônica. Entender esses parâmetros permite que você foque seu investimento em performance na medida certa.