Dupliquer 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. Quel est le meilleur moyen de calculer le temps d’exécution? Thread
? Timer
? Stopwatch
? Une autre solution? Je veux le plus exact et le plus bref possible.
Stopwatch
est conçu à cet effet et constitue l’un des meilleurs moyens de mesurer le temps d’exécution 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 le temps d'exécution en .NET.
METTRE À JOUR:
Comme l'a souligné @ series0ne dans la section commentaires: Si vous souhaitez obtenir une mesure précise de l'exécution de certains codes, vous devez utiliser les compteurs de performance intégrés au système d'exploitation. Le réponse suivante contient un aperçu de Nice.
D'après l'expérience personnelle, la classe System.Diagnostics.Stopwatch
peut être utilisée pour mesurer le temps d'exécution d'une méthode, cependant, MÉFIEZ-VOUS: 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; "pourquoi a-t-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é "de bruit de fond" dans .NET, telle que JIT. Par conséquent, la première fois que vous exécutez votre méthode, .NET JIT. Le temps nécessaire pour le faire est ajouté au moment de l'exécution. De même, d'autres facteurs entraîneront une variation du temps d'exécution.
Ce que vous devriez vraiment rechercher pour une précision absolue, c'est Performance Profiling!
Regardez ce qui suit:
RedGate ANTS Performance Profiler est un produit commercial, mais produit des résultats très précis. - Améliorez les performances de vos applications avec le profilage .NET
Voici un article de StackOverflow sur le profilage: - Quels sont certains bons profileurs .NET?
J'ai également écrit un article sur le profilage des performances à l'aide de chronomètre que vous voudrez peut-être consulter - Profilage des performances dans .NET
StopWatch
class recherche votre meilleure solution.
Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
En outre, il possède un champ statique appelé Stopwatch.IsHighResolution
. Bien entendu, il s’agit d’un problème de matériel et de système d’exploitation.
Indique si le minuteur est basé sur une performance haute résolution compteur.
Si vous souhaitez comprendre les performances, la meilleure solution consiste à utiliser un profileur.
Sinon, System.Diagnostics.StopWatch fournit un minuteur haute résolution.
Chronomètre utilisera le compteur haute résolution
Le chronomètre mesure le temps écoulé en comptant les ticks du minuteur dans le mécanisme de minuterie sous-jacent. Si le matériel installé et en fonctionnement système prend en charge un compteur de performance haute résolution, puis le La classe Stopwatch utilise ce compteur pour mesurer le temps écoulé. Autrement, la classe Chronomètre utilise le temporisateur système pour mesurer le temps écoulé. Utilisation les champs Fréquence et IsHighResolution pour déterminer la précision et résolution de la mise en œuvre du chronométrage.
Si vous mesurez IO, vos chiffres seront probablement affectés par des événements extérieurs, et je craindrais beaucoup. 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.
using System.Diagnostics;
class Program
{
static void Test1()
{
for (int i = 1; i <= 100; i++)
{
Console.WriteLine("Test1 " + i);
}
}
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
Test1();
sw.Stop();
Console.WriteLine("Time Taken-->{0}",sw.ElapsedMilliseconds);
}
}
J'ai utilisé la propriété Environment.TickCount
à cette fin.
int start = Environment.TickCount;
// Your code here...
int end = Environment.TickCount;
int diffInMilliseconds = end - start;