627 votes

Calculer la durée d’exécution d’une méthode

Double Possible:
Comment mesurer combien de temps est une fonction en cours d'exécution?

J'ai un I/O de temps méthode de prise de copie de données à partir d'un emplacement à un autre. Quelle est la meilleure et la plus vraie façon de calculer le temps d'exécution? Thread? Timer? Stopwatch? Toute autre solution? Je veux la plus exacte, et de plus brefs autant que possible.

1307voto

Darin Dimitrov Points 528142

Stopwatch est conçu à cet effet et est l'un de la meilleure façon de mesurer le temps d'exécution .NET.

var watch = Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

Ne pas utiliser DateTimes de mesurer le temps d'exécution .NET.


Mise à JOUR:

Comme l'a souligné @series0ne dans la section des commentaires si vous voulez une vraie mesure précise de l'exécution d'un code, vous aurez à utiliser les compteurs de performance qui est intégré dans le système d'exploitation. L' following answer contient une belle vue d'ensemble.

83voto

series0ne Points 4389

À partir de l'expérience personnelle, l' System.Diagnostics.Stopwatch classe peut être utilisée pour mesurer le temps d'exécution d'une méthode, cependant, MÉFIEZ-vous: Il n'est pas tout à fait exacte!

Considérons l'exemple suivant:

StopWatch sw = Stopwatch.StartNew();

for(int index = 0; index < 10; index++)
{
    DoSomething();
    Console.WriteLine(sw.MilliSeconds)
}

sw.Stop();

Exemple de résultats

132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

Maintenant, vous vous demandez; "eh bien, pourquoi n'avait-il 132ms la première fois, et beaucoup moins le reste du temps?"

La réponse est qu' Stopwatch ne permet pas de compenser pour le "bruit de fond" de l'activité .NET, comme JITing. Donc la première fois que vous exécutez votre méthode .NET JIT du premier. Le temps qu'il faut pour ce faire est ajoutée au moment de l'exécution. De même, d'autres facteurs peuvent également causer le temps d'exécution de varier.

Ce que vous devriez vraiment être à la recherche de la précision absolue est de Profilage des Performances!

Jetez un oeil à ce qui suit:

RedGate FOURMIS Performance Profiler est un produit commercial, mais produit des résultats très précis. - http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/

Voici une StackOverflow article sur le profilage: - Quelles Sont les Bonnes .NET Profileurs?

J'ai également écrit un article sur le Profilage des Performances à l'aide du Chronomètre que vous pouvez consulter: - le profilage des Performances .NET

35voto

Soner Gönül Points 35739

StopWatch classe ressemble pour votre meilleure solution.

Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

Il a également un champ statique appelée Stopwatch.IsHighResolution. Bien sûr, c'est un matériel et système d'exploitation en question.

Indique si la minuterie est basé sur une haute résolution de performance le compteur.

20voto

Jeff Foster Points 22175

Si vous êtes intéressé à comprendre le rendement, la meilleure réponse consiste à utiliser un profileur.

Sinon, System.Diagnostics.StopWatch fournit une minuterie haute résolution.

7voto

Brian Agnew Points 143181

Chronomètre va utiliser le compteur haute résolution

Le Chronomètre mesure le temps écoulé par le comptage du minuteur de tiques dans le sous-jacente de la minuterie mécanisme. Si le matériel installé et d'exploitation le système de soutien, une haute résolution de compteur de performance, puis la Chronomètre classe utilise le compteur pour mesurer le temps écoulé. Sinon, le Chronomètre de la classe utilise l'horloge système pour mesurer le temps écoulé. Utilisation la Fréquence et la IsHighResolution champs pour déterminer la précision et de la résolution du Chronomètre calendrier de mise en œuvre.

Si vous êtes à la mesure OI alors vos chiffres pourraient être touchées par des événements extérieurs, et je voudrais vous inquiétez pas tellement ré. exactitude (comme vous l'avez indiqué ci-dessus). Au lieu de cela, je voudrais prendre un éventail de mesures et de considérer la moyenne et la distribution de ces chiffres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X