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.

Dariusz
fonte
1
O Stopmétodo evita erros descuidados, por exemplo, se você estiver avaliando a Elapsedpropriedade várias vezes.
Tim Schmelter de
3
Dê uma olhada na fonte: referencesource.microsoft.com/#System/services/monitoring/…
Kris Vandermotten
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.

Uriil
fonte
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 .

Mohammad Dehghan
fonte
5

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

vvv
fonte
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 ().

funbrain9
fonte