Mesure le temps d'exécution en C#
Je veux mesurer l'exécution d'un morceau de code, et je me demande quelle est la meilleure méthode pour ce faire est?
Option 1:
DateTime StartTime = DateTime.Now;
//Code
TimeSpan ts = DateTime.Now.Subtract(StartTime);
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine(elapsedTime, "RunTime");
Option 2:
en utilisant le Système.Diagnostics;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
//Code
stopWatch.Stop();
//Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
//Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine(elapsedTime, "RunTime");
Ce n'est pas simplement pour l'analyse comparative, sa fait partie de l'application. Le temps de la fonction prend de l'exécution des données pertinentes. Il n'a cependant pas besoin d'être atomique ou hyper-précis.
Quelle est la meilleure option pour la production de code, ou quelqu'un d'autre de quelque chose de différent et peut-être mieux?
- Bonne question! Je suis curieux de savoir la réponse!
Vous devez vous connecter pour publier un commentaire.
La
Stopwatch
classe est spécifiquement conçu pour mesurer le temps écoulé et peut (si disponible sur votre matériel) fournir une bonne granularité/précision à l'aide d'un sous-jacentes à haute-fréquence d'horloge du matériel. Donc, ce semble le meilleur choix.La IsHighResolution propriété peut être utilisé pour déterminer si haute résolution calendrier est disponible. Par la documentation, cette classe offre un wrapper sur les 'meilleurs' Api Win32 pour un chronométrage précis:
Il y a un historique détaillé sur les Api Win32 [ici] et dans MSDN docs Deux.
Stopwatch
utilise également la haute résolution de la minuterie (quand il est disponible), ce qui est essentiel lors de la mesure de code avec de courts délais d'exécution.Stopwatch
et pasStopWatch
(mineur, je sais, mais autoresolving dépendances ne fonctionnera pas si vous vous trompez).Ce n'est pas juste que
StopWatch
est plus précis, mais aussi queDateTime.Now
va donner des résultats incorrects dans certaines circonstances.Considérer ce qui se passe pendant une heure de commutation, par exemple — à l'aide de
DateTime.Now
peut effectivement donner un négatif réponse!J'utilise généralement
StopWatch
pour ce genre de situation.De MSDN page:
Dans le post suivant, je l'utilise pour comparer le temps d'exécution de LINQ vs PLINQ:
Parallel LINQ (PLINQ) avec Visual Studio 2010
StopWatch
àStopwatch
Ni nuira à la performance, parce que vous dites ce n'est pas que critique. Chronomètre semble plus approprié, vous êtes seulement en soustrayant de temps en temps et pas une date à partir d'un autre. Date de choses prend un peu plus de mémoire et de temps PROCESSEUR à traiter. Il y a aussi des façons de rendre le code plus propre, dans le cas où vous prévoyez de les réutiliser dans plusieurs endroits. La surcharge
using
vient à l'esprit. Je recherche un exemple. Ok, le code de vol à partir de:http://stevesmithblog.com/blog/great-uses-of-using-statement-in-c/
Les deux vont probablement s'adapter à vos besoins parfaitement, mais je dirais que l'utilisation
StopWatch
. Pourquoi? Parce que ça signifiait pour la tâche que vous êtes en train de faire.Vous avez une classe qui est construit pour retourner la date/heure actuelle, qui, comme il arrive, peut être utilisé pour la synchronisation des choses, et vous avez une classe spécifiquement conçu pour chronométrage des choses.
Dans ce cas, les différences existent vraiment si vous avez besoin d'une précision à la milliseconde (Dans ce cas,
StopWatch
est plus précis), mais comme un principe général si un outil existe spécifiquement pour la tâche que vous êtes à la recherche pour alors que c'est le meilleur à utiliser.J'ai un peu de classe à faire ce genre de chose ad hoc. Il utilise le chronomètre de la classe c# micro performance test.
par exemple.
Utilisez code ci-dessous
J'ai pris Hamish réponse simplifié et rendu un peu plus générale, dans le cas où vous avez besoin pour vous connecter à un autre endroit: