Dois-je arrêter le chronomètre à la fin de la méthode?

89

Imaginons que nous ayons des mesures simples en utilisant 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?
}

Selon MSDN:

Dans un scénario classique de Chronomètre, vous appelez la méthode Start, puis appelez finalement la méthode Stop , puis vous vérifiez le temps écoulé à l'aide de la propriété Elapsed.

Je ne sais pas si je devrais appeler cette méthode lorsque je ne suis plus intéressé par l'instance de minuterie. Dois-je "éclaircir" en utilisant la Stopméthode?

ÉDITER

Gardez à l'esprit que Logger.Log (..) ne coûte rien car il timer.Elapsedest lu avant les journaux de l'enregistreur.

Dariusz
la source
1
La Stopméthode vous évite d'erreurs imprudentes, par exemple si vous évaluez la Elapsedpropriété plusieurs fois.
Tim Schmelter
3
Jetez un œil à la source: referencesource.microsoft.com/#System/services/monitoring/...
Kris Vandermotten
Puisque le chronomètre est hors de portée, pourquoi pensez-vous que l'appel Stopferait une différence? Vous ne pouvez pas utiliser la valeur de toute façon
Par défaut

Réponses:

81

Non, vous n'avez pas besoin de l'arrêter. Stop()arrête juste de suivre le temps écoulé. Cela ne libère aucune ressource.

Uriil
la source
4
Mais il est bon de l'utiliser quand même pour éviter les erreurs imprudentes.
Tim Schmelter
12
Cela n'empêche rien, il crée le chronomètre dans la méthode et ne le retourne pas, donc il ne pourra pas le récupérer plus tard pour "faire des erreurs avec".
Ronan Thibaudau
21
De plus, un chronomètre ne fait aucun travail ou ne mange pas de cycles d'horloge du processeur entre les appels à Start () et Stop (). Start () définit simplement un horodatage sur now et Stop () calcule et enregistre le temps écoulé depuis. Voir la source dans coreclr: github.com/dotnet/corefx/blob/master/src/…
Sammi
41

Non, il n'est pas nécessaire de l'arrêter ou de le nettoyer.

Stopwatchn'utilise aucune ressource non gérée (si vous y avez pensé IDisposable). Il n'utilise en fait aucune ressource du tout (sauf la mémoire utilisée par l'objet lui-même, bien sûr)! Il ne consomme pas non plus de CPU lors de la mesure du temps écoulé!

Dans Windows implémentations de .NET (Framework complet .NET, Mono, .NET de base), il appelle simplement l' QueryPerformanceCounter()API Windows en cas de besoin (sur Start()et Stop()et lors de la lecture Elapsed) pour récupérer un horodatage à haute résolution.

Dans les implémentations Linux de Mono et .NET Core, il utilise une clock_gettimefonction pour récupérer une valeur de temps croissante monotone.

À tous ceux qui ont une réelle curiosité sur les détails de la mise en œuvre: lisez cet article .

Mohammad Dehghan
la source
5

Je pense que Stop est utile si vous souhaitez réutiliser la valeur Elapsed.

vvv
la source
Mais je n'en ai pas besoin dans mon exemple :)
Dariusz
Alors c'est super :), j'aurais dû utiliser "seulement" La classe n'implémente pas l'interface Dispose, donc aucun nettoyage ne devrait être déclenché.
vvv
2
@vvv Si vous voulez, vous pouvez ajouter cela à votre réponse - il y a un bouton entre la réponse et les commentaires qui dit "modifier".
Par défaut le
0

Si votre code n'a pas besoin de calculer, alors inutile d'utiliser Stop ().

ssh
la source