¿Debo detener el cronómetro al final del método?

89

Imaginemos que tenemos medidas 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?
}

Según MSDN:

En un escenario típico de Stopwatch, llama al método Start, luego llama al método Stop , y luego verifica el tiempo transcurrido usando la propiedad Elapsed.

No estoy seguro de si debería llamar a este método cuando ya no estoy interesado en la instancia del temporizador. ¿Debo "aclarar" usando el Stopmétodo?

EDITAR

Tenga en cuenta que Logger.Log (..) no cuesta nada porque timer.Elapsedse lee antes de que el registrador registre.

Dariusz
fuente
1
El Stopmétodo evita que cometa errores por descuido, por ejemplo, si está evaluando la Elapsedpropiedad varias veces.
Tim Schmelter
3
Eche un vistazo a la fuente: referenciasource.microsoft.com/#System/services/monitoring/…
Kris Vandermotten
Dado que el temporizador está saliendo de su alcance, ¿por qué cree que llamar Stopharía alguna diferencia? No puede usar el valor de todos modos
predeterminado

Respuestas:

81

No, no necesitas detenerlo. Stop()simplemente deja de rastrear el tiempo transcurrido. No libera recursos.

Uriil
fuente
4
Pero es una buena práctica usarlo de todos modos para evitar errores por descuido.
Tim Schmelter
12
No evita nada, está creando el cronómetro en el método y no lo devuelve, por lo que no podrá agarrarlo más tarde para "cometer errores".
Ronan Thibaudau
21
Además, un cronómetro no está haciendo ningún trabajo o comiendo ciclos de reloj de CPU entre las llamadas a Start () y Stop (). Start () simplemente establece una marca de tiempo en ahora y Stop () calcula y guarda el tiempo transcurrido desde eso. Ver fuente en coreclr: github.com/dotnet/corefx/blob/master/src/…
Sammi
41

No, no es necesario detenerlo ni limpiarlo.

Stopwatchno utiliza ningún recurso no administrado (si lo pensó IDisposable). En realidad, no utiliza ningún recurso (excepto la memoria utilizada por el objeto en sí, por supuesto). ¡Tampoco consume CPU mientras mide el tiempo transcurrido!

En Windows implementaciones de .NET (.NET Framework completo, Mono, .NET Core), que sólo llama a la QueryPerformanceCounter()API de Windows cuando sea necesario (en Start()y Stop()y al leer Elapsed) para recuperar un sello de tiempo de alta resolución.

En las implementaciones de Linux de Mono y .NET Core, usa la clock_gettimefunción para recuperar un valor de tiempo creciente monótono.

Para cualquiera que tenga una verdadera curiosidad sobre los detalles de implementación: lea esta publicación .

Mohammad Dehghan
fuente
5

Creo que Detener es útil si desea reutilizar el valor Transcurrido.

vvv
fuente
Pero no necesito en mi ejemplo :)
Dariusz
Entonces es genial :), debería haber usado "solo" La clase no implementa la interfaz Dispose, por lo que no debería activarse ninguna limpieza.
vvv
2
@vvv Si lo desea, puede agregar eso a su respuesta; hay un botón entre la respuesta y los comentarios que dice "editar".
Predeterminado el
0

Si su código no necesita ser calculado, entonces no necesita usar Stop ().

ssh
fuente