Duplicata possible:
comment mesurer la durée d'exécution d'une fonction?
J'ai une méthode de prise d'E / S qui copie les données d'un emplacement à un autre. Quelle est la façon la meilleure et la plus réelle de calculer le temps d'exécution? Thread
? Timer
? Stopwatch
? Une autre solution? Je veux la plus exacte et la plus brève possible.
ThreadPool.QueueUserWorkItem(delegate { CopyFiles(folder, dest); });
intérieur, mais le chronomètre s'arrête avant que tout ne soit fait.Par expérience personnelle, la
System.Diagnostics.Stopwatch
classe peut être utilisée pour mesurer le temps d'exécution d'une méthode, cependant ATTENTION : elle n'est pas tout à fait exacte!Prenons l'exemple suivant:
Exemples de résultats
Vous vous demandez maintenant; "eh bien pourquoi a-t-il fallu 132 ms la première fois, et nettement moins le reste du temps?"
La réponse est que
Stopwatch
cela ne compense pas l'activité de «bruit de fond» dans .NET, comme JITing. Par conséquent, la première fois que vous exécutez votre méthode, .NET JIT est la première. Le temps nécessaire pour ce faire s'ajoute au temps 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, c'est le profilage des performances !
Jetez un œil à ce qui suit:
RedGate ANTS Performance Profiler est un produit commercial, mais produit des résultats très précis. - Boostez les performances de vos applications avec le profilage .NET
Voici un article StackOverflow sur le profilage: - Quels sont les bons profileurs .NET?
J'ai également écrit un article sur le profilage des performances à l'aide du chronomètre que vous voudrez peut-être consulter - Profilage des performances dans .NET
la source
StopWatch
la classe recherche votre meilleure solution.Il a également un champ statique appelé
Stopwatch.IsHighResolution
. Bien sûr, il s'agit d'un problème de matériel et de système d'exploitation.la source
Si vous souhaitez comprendre les performances, la meilleure réponse consiste à utiliser un profileur.
Sinon, System.Diagnostics.StopWatch fournit une minuterie haute résolution.
la source
StopWatch utilisera le compteur haute résolution
Si vous mesurez les E / S, vos chiffres seront probablement affectés par des événements externes, et je m'inquiéterais tellement. 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.
la source
la source