terça-feira, 9 de novembro de 2010

Tempo de Instanciação de Variáveis em C#

Sempre me preocupei com as boas práticas de programação e questões de desempenho de software. Mas o mais legal não é ler sobre isso (não que não seja importante, muito pelo contrário), é abrir o Visual Studio e ver na prática as coisas funcionando. Bom, vamos a elas.

O propósito de hoje é descobrir o quanto a instanciação das variáveis interfere no desempenho do software. Para isso, abra o Visual Studio e crie um projeto do tipo "Console Application" para C#. Ele gera a solution, uma Class Library e uma classe Program.cs. Utilize a classe Program.cs para os testes.

A primeira coisa que a fazer é criar uma constante para guardar a quantidade de iterações (Figura 1). À medida que formos executando o teste, basta alterá-la.

      Figura 1 - Total de Iterações

Agora crie o método ObterTempoVariasInstancias() para calcular o tempo de instanciação de várias instâncias (Figura 2).

Figura 2  - Método ObterTempoVariasInstancias


Neste método não há nada demais. Nas linhas 3-4 eu instancio um objeto Stopwatch para calcular o tempo de instanciação das variáveis e o tempo começa a ser contado. Perceba que nas linhas 8-9, toda vez que uma iteração é executada, uma variável nova é instanciada. Na linha 12 o tempo é finalizado e na 13 é retornado o tempo total em milissegundos.

Para medir o tempo, utilizei um notebook Core 2 Duo 2.1 Ghz de 32 bits. Fui alterando a constante TOTAL_ITERACOES e anotando os tempos. Rodei três vezes para cada quantidade de iterações e calculei a média dos tempos de 10 até 1.000.000. Seguem os tempos (Figura 3):

Figura 3 - Tempos para instanciação de várias variáveis


Fiz a mesma coisa para a instanciação de uma variável (Figura 4).

Figura 4 - Método ObterTempoUmaInstancia


As diferenças para o método anterior estão nas linhas 6-10 em que a variável j é instanciada fora do bloco do for e reaproveitada internamente. Desta forma, existe somente uma variável sendo utilizada durante a iteração. E abaixo os resultados (Figura 5):

Figura 5 - Tempos para instanciação de uma variável



Por fim, comparei as duas situações diminuindo o tempo médio para instanciar uma variável e utilizá-la durante todas as iterações do tempo médio para instanciar quantas variáveis for o total de iterações (Figura 6).

Figura 6 - Comparação entre os tempos



Pela tabela acima, percebe-se que utilizar somente uma variável na iteração é mais rápido.

Para esse teste simples, a diferença não foi considerável (apenas para 1.000.000 iterações), porém em um software com várias buscas no banco de dados, muitos usuários acessando e funcionalidades complexas, esse tempo tende a aumentar bastante.
Portanto, uma boa prática de programação é não encher a aplicação de variáveis que podem ser reaproveitadas, reduzindo assim o tempo de execução das funções.