Stopwatch – Como controlar a performance do seu código.    

Boa noite pessoal, hoje vou com um post pequeno, porém, de muita importância para as pessoas. Na minha experiência, vi que muitas pessoas, inclusive eu algumas vezes, não sabem muito bem como medir desempenho dos códigos. Muitas vezes, quando as pessoas querem saber quanto tempo dura uma execução de um código, acabam utilizando as classes DateTime e/ou TimeSpan.

Na realidade é comum armazenar um DateTime.Now antes do método a ser verificado e subtrair o valor de um novo DateTime.Now do final do código. Da seguinte Forma:

	static void Main(string[] args)
        {

            var ini = DateTime.Now;

            DoWork();

            var fim = DateTime.Now.Subtract(ini);

            Console.WriteLine("Tempo total: {0}", ini.TimeOfDay.Milliseconds);

            Console.ReadKey();
        }

        private static void DoWork()
        {
            foreach(string dir in Directory.GetDirectories(@"C:\")){

                Console.WriteLine(dir);
            }
           
        }

Até parece funcionar, porém, utilizando este código para verificar desempenho, você já está perdendo desempenho, porque o DateTime é uma estrutura um pouco complexa para uma simples validação de tempo decorrido, além da necessidade de fazer uma subtração também ter um certo custo para o trabalho.

Agora, se utilizarmos a classe Stopwatch, muita coisa pode mudar. Além de ser uma classe muito mais simples, o seu intuito é realmente controlar tempos decorridos. Sua performance é muito melhor, e se alterarmos o código acima para utilizar Stopwatch, veremos que o tempo decorrido é bem menor. Na realidade o tempo exibido é bem mais correto, porque utilizando DateTime, muito do tempo perdido é para a criação da estrutura do DateTime.

Com o Stopwatch ficaria assim:

	static void Main(string[] args)
        {

            var tempo = new Stopwatch();

            tempo.Start();

            DoWork();

            tempo.Stop();

            Console.WriteLine("Tempo total: {0}", tempo.Elapsed.Milliseconds);

            Console.ReadKey();
        }

Se você executar os códigos acima, verá que o tempo decorrido com o Stopwatch é muito inferior. Além da utilização ser mais simples.

A classe Stopwatch, localizada no namespace System.Diagnostics, tem métodos muitos simples. Basicamente você começa a controlar o tempo invocando o método Start e quando desejar parar de controlar o tempo decorrido invoca o método Stop.

Para validar o tempo decorrido, você utiliza as propriedades Elapsed, que retorna um TimeSpan, ou a propriedade ElapsedMilliseconds, que retorna os milissegundos decorridos, ou a propriedade ElapsedTicks, que, adivinhem só, retorna os Ticks decorridos desde o Start.

O Stopwatch pode ser utilizado para o controle de vários intervalos de tempo. Para utilizar dessa forma, você pode simplesmente invocar o método Start novamente após o Stop, e o contador do tempo decorrido continuará sendo contado a partir do ponto onde parou, ou seja, o Stop funciona como uma pausa na contagem do tempo decorrido. Se você realmente quiser reiniciar o contador, deve invocar o método Reset.

Além do que já foi falado, o Stopwatch tem apenas mais uma propriedade que não comentei, a propriedade IsRunning, que retorna um booelano indicando se o contador está rodando ou não.

Para finalizar, é possível simplificar ainda mais o código, utilizando o método estático StartNew da classe Stopwatch para criar a estância da classe e já invocar o método Start automaticamente, o código fica um pouco mais simples, repare:

	static void Main(string[] args)
        {
	    //A linha abaixo substitui a invocação do new() e do Start()
            var tempo = Stopwatch.StartNew();
            
            DoWork();

            tempo.Stop();
            
            Console.WriteLine("Tempo total: {0}", tempo.Elapsed.Milliseconds);

            Console.ReadKey();
        }

Bom, fica ai a dica de quando você precisar controlar a performance do seu código. É muito mais simples, mais rápido e mais correto utilizar o Stopwatch ao invés do DateTime ou outra técnica qualquer para controlar tempos decorridos.

Espero que possa ajudá-los.

Até o próximo post.

7. outubro 2010 08:11 by Frederico | Comments (1) | Permalink

Sobre mim

Minha Imagem

Meu nome é Frederico Batista Emídio, trabalho com desenvolvimento de sistemas profissionalmente a oito anos, porém, já faço sites pessoais a pelo menos dez anos.

Para saber mais clique aqui.

Páginas

Calendário

<<  novembro 2017  >>
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

Visualizar posts em um Calendário
Sigua @fredemidio

MCP Asp.NET