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.
Réponses
Trop de publicités?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.
À 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
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.
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.
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.