Devo parar o cronômetro no final do método?


89

Vamos imaginar que temos medições simples usando Stopwatch

public void DoWork()
{
    var timer = Stopwatch.StartNew();
    // some hard work
    Logger.Log("Time elapsed: {0}", timer.Elapsed);
    timer.Stop(); // Do I need to call this?
}

De acordo com o MSDN:

Em um cenário típico do Cronômetro, você chama o método Start e, por fim, chama o método Stop e verifica o tempo decorrido usando a propriedade Elapsed.

Não tenho certeza se devo chamar esse método quando não estou mais interessado na instância do temporizador. Devo "limpar" usando o Stopmétodo?

EDITAR

Lembre-se de que Logger.Log (..) não custa nada porque timer.Elapsedé lido antes dos logs do logger.


1
O Stopmétodo evita erros descuidados, por exemplo, se você estiver avaliando a Elapsedpropriedade várias vezes.
— Tim Schmelter de


Visto que o cronômetro está saindo do escopo, por que você acredita que chamar Stopfaria alguma diferença? Você não pode usar o valor de qualquer maneira
— Padrão de

Respostas:


82

Não, você não precisa parar. Stop()apenas para de rastrear o tempo decorrido. Isso não libera nenhum recurso.


4
Mas é uma boa prática usá-lo de qualquer maneira para evitar erros por descuido.
— Tim Schmelter

13
Não impede nada, ele está criando o cronômetro no método e não está devolvendo, então não vai conseguir pegar mais tarde para "errar".
— Ronan Thibaudau de

21
Além disso, um cronômetro não está fazendo nenhum trabalho ou comendo ciclos de clock da CPU entre as chamadas para Iniciar () e Parar (). Start () apenas define um timestamp para agora e Stop () calcula e salva o tempo decorrido desde então. Veja a fonte em coreclr: github.com/dotnet/corefx/blob/master/src/…
— Sammi

42

Não, não há necessidade de parar ou limpar.

Stopwatchnão usa nenhum recurso não gerenciado (se você pensou IDisposable). Na verdade, ele não usa nenhum recurso (exceto a memória usada pelo próprio objeto, é claro)! Também não consome CPU enquanto mede o tempo decorrido!

No Windows implementações do .NET (.NET Framework completo, Mono, .NET Core), ele só chama a QueryPerformanceCounter()API do Windows quando necessário (on Start()e Stop()e quando lendo Elapsed) para recuperar um carimbo de tempo de alta resolução.

Em implementações Linux de Mono e .NET Core, ele usa a clock_gettimefunção para recuperar um valor de tempo crescente monotônico.

Para quem realmente tem curiosidade sobre os detalhes da implementação: leia este post .


5

Acho que Stop é útil se você quiser reutilizar o valor Decorrido.


Mas não preciso no meu exemplo :)
— Dariusz

Então é ótimo :), eu deveria ter usado "apenas" A classe não implementa a interface Dispose, então nenhuma limpeza deve ser acionada.
— vvv

2
@vvv Se quiser, pode adicionar isso à sua resposta - há um botão entre a resposta e os comentários que diz "editar".
— Padrão de

0

Se o seu código não precisa calcular, não há necessidade de usar Stop ().

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.