Devo fermare il cronometro alla fine del metodo?


89

Immaginiamo di avere semplici misurazioni 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?
}

Secondo MSDN:

In uno scenario tipico di Stopwatch, si chiama il metodo Start, quindi si chiama infine il metodo Stop e quindi si controlla il tempo trascorso utilizzando la proprietà Elapsed.

Non sono sicuro di dover chiamare questo metodo quando non sono più interessato all'istanza del timer. Devo "chiarire" usando il Stopmetodo?

MODIFICARE

Tieni presente che Logger.Log (..) non costa nulla perché timer.Elapsedviene letto prima dei log del logger.


1
Il Stopmetodo ti impedisce di fare errori negligenti, ad esempio se stai valutando la Elapsedproprietà più volte.
Tim Schmelter


Dato che il timer sta uscendo dall'ambito, perché credi che la chiamata Stopfarebbe differenza? Non è comunque possibile utilizzare il valore
predefinito il

Risposte:


82

No, non è necessario fermarlo. Stop()smette di tenere traccia del tempo trascorso. Non libera alcuna risorsa.


4
Ma è buona norma utilizzarlo comunque per evitare errori imprudenti.
Tim Schmelter

13
Non impedisce nulla, sta creando il cronometro nel metodo e non lo restituisce, quindi non potrà più contattarlo per "sbagliare con".
Ronan Thibaudau

21
Inoltre un cronometro non sta facendo alcun lavoro o non mangia cicli di clock della CPU tra le chiamate a Start () e Stop (). Start () imposta solo un timestamp su adesso e Stop () calcola e salva il tempo trascorso da allora. Vedi la fonte in coreclr: github.com/dotnet/corefx/blob/master/src/…
Sammi

42

No, non è necessario fermarlo o pulirlo.

Stopwatchnon utilizza risorse non gestite (se ci hai pensato IDisposable). In realtà non utilizza affatto risorse (tranne la memoria utilizzata dall'oggetto stesso, ovviamente)! Inoltre non consuma CPU durante la misurazione del tempo trascorso!

In Windows implementazioni di .NET (versione completa di .NET Framework, Mono, .NET Core), semplicemente chiama l' QueryPerformanceCounter()API di Windows quando necessario (su Start()e Stop()e durante la lettura Elapsed) per recuperare un tempo di alta risoluzione di bollo.

Nelle implementazioni Linux di Mono e .NET Core, utilizza la clock_gettimefunzione per recuperare un valore temporale crescente monotono.

A chiunque abbia una vera curiosità sui dettagli di implementazione: leggi questo post .


5

Penso che Stop sia utile se vuoi riutilizzare il valore Elapsed.


Ma non ho bisogno nel mio esempio :)
Dariusz

Allora è fantastico :), avrei dovuto usare "solo" La classe non implementa l'interfaccia Dispose, quindi nessuna pulizia dovrebbe essere attivata.
vvv

2
@vvv Se vuoi puoi aggiungerlo alla tua risposta - c'è un pulsante tra la risposta e i commenti che dice "modifica".
Predefinito

0

Se il codice non deve essere calcolato, non è necessario utilizzare Stop ().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.