Calculer le temps d'exécution d'une méthode
Doublon Possible:
Comment mesurer la durée d'exécution d'une fonction?
J'ai une méthode de prise de temps d'E/S qui copie les données d'un emplacement à un autre. Quelle est la meilleure et la plus réelle façon de calculer le temps d'exécution? Thread
? Timer
? Stopwatch
? Toute autre solution? Je veux le plus exact, et le plus bref possible.
5 réponses
Stopwatch
est conçu à cet effet et est l'un des meilleurs moyens de mesurer l'exécution du temps dans .NET.
var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
Ne pas utiliser DateTime pour mesurer l'exécution du temps dans. NET.
Mise à jour:
Comme indiqué par @series0ne dans la section Commentaires: Si vous voulez une mesure précise de l'exécution d'un code, vous devrez utiliser les compteurs de performance intégrés au système d'exploitation. La réponse suivante contient une belle aperçu.
Par expérience personnelle, la classe System.Diagnostics.Stopwatch
peut être utilisée pour mesurer le temps d'exécution d'une méthode, cependant, attention : Ce n'est pas tout à fait exact!
Considérons l'exemple suivant:
Stopwatch sw;
for(int index = 0; index < 10; index++)
{
sw = Stopwatch.StartNew();
DoSomething();
Console.WriteLine(sw.ElapsedMilliseconds);
}
sw.Stop();
Exemple de résultats
132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms
Maintenant, vous vous demandez; " Eh bien, pourquoi at-il fallu 132 ms la première fois, et beaucoup moins le reste du temps?"
La réponse est que Stopwatch
ne compense pas l'activité "bruit de fond" dans. NET, comme JITing. Par conséquent, la première fois que vous exécutez votre méthode,. net JIT est le premier. Le temps qu'il faut pour le faire est ajouté à l'Heure de l'exécution. De même, d'autres facteurs feront également varier le temps d'exécution.
Ce que vous devriez vraiment rechercher pour une précision absolue est Performance Profiling!
Jetez un oeil à ce qui suit:
Redgate ANTS Performance Profiler est un produit commercial, mais produit des résultats très précis. - Boostez le performances de vos applications avec. net profiling
Voici un article de StackOverflow sur le profilage: - Quels sont les bons profileurs. net?
J'ai également écrit un article sur le profilage des performances en utilisant le chronomètre que vous voudrez peut-être regarder- profilage des performances dans. net
StopWatch
classe ressemble pour votre meilleure solution.
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
En outre, il a un champ statique appelé Stopwatch.IsHighResolution
. Bien sûr, il s'agit d'un problème matériel et de système d'exploitation.
Indique si la minuterie est basée sur une performance haute résolution compteur.
Si vous êtes intéressé par la compréhension des performances, la meilleure réponse est d'utiliser un profileur.
Sinon Système.Diagnostic.Chronomètre fournit une minuterie haute résolution.
Le chronomètre utilisera le compteur haute résolution
Le chronomètre mesure le temps écoulé En comptant les mécanisme de minuterie sous-jacent. Si le matériel installé et d'exploitation Système Soutien une haute-résolution performance compteur, puis le La classe chronomètre utilise ce compteur pour mesurer le temps écoulé. Autrement, la classe Chronomètre utilise la minuterie système pour mesurer le temps écoulé. Utiliser les champs fréquence et IsHighResolution pour déterminer précision et la résolution de la mise en œuvre de chronomètre timing.
Si vous mesurez IO alors vos chiffres seront probablement impactés par des événements externes, et je m'inquiéterais tellement re. exactitude (comme vous l'avez indiqué ci-dessus). Au lieu de cela, je prendrais une gamme de mesures et considérerais la moyenne et la distribution de ces chiffres.