5 de abr. de 2009

Performance de Software

Já tive algumas experiências um pouco atordoantes com relação a performance de Software e conforme estudamos sobre o assunto descobrimos que é muito difícil chegar a performance ideal, principalmente quando temos um "time" trabalhando no mesmo produto(software), mas como fazer com que seu software tenha uma performance aceitável?

Pare e pense quais são as opções, qual o custo-benefício de cada uma delas?

Imagine em seu caso o que será melhor?
Alguns pontos que podem fazer diferença para que seu software tenha performance são:

Otimização utilização de Memória
A utilização da memória pode ser uma questão bastante importante quando se necessita processar grandes massas de dados, pois a cada iteração podemos estar criando áreas na memória sem necessidade.

Criação de objetos, variáveis e iterações(linha de código) sem necessidade são as maiores causas da queda de performance.

Como por exemplo geração de "Log" do processamento, qual o custo benefício de deixar algumas linhas de código que escrevem em um arquivo, event log, banco, etc. será que um simples tratamento de erro não faça a captura das informações necessárias para a solução de um problema.

Utilização de "string", para cada "" ou "texto" referenciado em código é criada uma área na memória para armazenar a informação referenciada, por isso é importante usar o string.Empty ele é uma área única na memória que tem o valor "", com isso nenhuma área desnecessária será criada na memória. Outra questão é a concatenação dos textos, algumas linguagens oferecem opções de concatenação mais eficientes do que um simples (+), como no .NET a classe StringBuilder.

Remover todos os objetos e variáveis alocados em memória que não serão mais utilizados, com linguagens não gerenciadas isto soa como um pré-requisito, mas ainda assim existem muitos programas que deixam a memória alocada. Já com o código gerenciado a maioria dos desenvolvedores não se preocupam com isto, por que a máquina virtual possui uma ferramenta denominada como "Coletor de Lixo", esta ferramenta de em determinado período de tempo, vasculha a área da memória que é de sua responsabilidade e avalia se existem objetos/variáveis que podem ser removidos da memória, o grande problema nisto é que quando temos softwares para tratar muitos dados em sequência este tempo pode não ser suficiente para liberar o espaço na memória e é ai onde podemos obter grandes ganhos na performance, e por este motivo devemos forçar com que este espaço seja removido da memória.

A sequência de carregamento dos dados pode ser importante também, como por exemplo carregar uma árvore de informações, porém somente os primeiros itens da árvore aparecerão e de acordo com as iterações do usuário carrego os itens filhos. Para apoiar este conceito, na Web existe uma técnica de desenvolvimento denominada "AJAX" que é a junção de determinadas tecnologias para que as informações transmitidas sejam menores e carregadas de acordo com a necessidade.

Boas práticas de desenvolvimento(Design Patern)
Algumas boas práticas de desenvolvimento também podem ser utilizadas para ganhar performance.

Infelizmente o assunto é bastante extenso, mas com o tempo vou tentar abordar algumas das boas práticas aqui no blog, mas enquanto isso segue um link
http://pt.wikipedia.org/wiki/Padr%C3%B5es_de_projeto_de_software


Reutilização de código
A reutilização de código não reduz apenas as linhas de código no programa, também reduz o tamanho dos executáveis gerados, fazendo com que seu programa fique mais leve para ser carregado na memoria.


Conclusão
 A performance de software pode ser obtida de várias maneiras, porém o ideal é avaliar os benefícios de cada opção para a sua situação.