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.


1
La Stopméthode vous évite d'erreurs imprudentes, par exemple si vous évaluez la Elapsedpropriété plusieurs fois.
Tim Schmelter


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.


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 .


5

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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.