Doublons possibles:
DateTime.Now est-il le meilleur moyen de mesurer les performances d'une fonction?
Chronomètre vs utilisation de System.DateTime.Now pour les événements de chronométrage
J'ai du code qui doit s'exécuter le plus rapidement possible. Pour pouvoir enregistrer le temps d'exécution, j'utilise la classe Chronomètre . Je soupçonne que le chronomètre peut affecter les performances de manière négative. Peut-être que l'utilisation d'une différence DateTime peut être plus efficace?
Lequel pensez-vous a de meilleures performances?
Stopwatch sw = new Stopwatch();
sw.Start();
int a = 5;
// Critical lines of code
long elapsedMs = se.Elapsed.TotalMilliseconds;
OR
DateTime startDate = DateTime.Now;
int a = 5;
// Critical lines of code
long elapsedMs = DateTime.Now.Subtract(startDate).TotalMilleseconds;
Stopwatch
ne fait rien entre les appels à Start
et Stop
... Il stocke simplement l'horodatage actuel (via QueryPerformanceCounter
) lorsque vous démarrez et le comparer à l'horodatage actuel lorsque vous l'arrêtez. Il n'y a donc aucune raison que cela puisse affecter les performances de votre code, du moins pas de manière significative. Stopwatch
a été spécialement conçu pour des mesures de temps précises, vous pouvez donc être sûr qu'il est parfaitement optimisé. Elle est également beaucoup plus précise que la comparaison de valeurs successives de DateTime.Now
. ...
Étant donné que votre code de profilage n'est exécuté qu'une seule fois, son impact sur les performances doit être négligeable. Ce n'est un problème que si vous placez des appels au chronomètre dans votre boucle interne/chemins de code critiques.
GetTickCount()
devrait être l'un des moyens les plus rapides de profiler, mais il n'a qu'une précision de quelques millisecondes. La fonction GetTickCount()
Windows API ne vérifie qu'une simple variable (qui est mise à jour toutes les quelques millisecondes); son coût est le coût d'une invocation de méthode native et rien de plus. Il est exposé comme Environment.TickCount
in . NET . Mais comme je l'ai dit, je doute que ce soit important. DateTime.UtcNow/Now
ont la même (faible) précision que GetTickCount
.
En théorie, il pourrait y avoir un certain effet sur la gigue, mais c'est peu probable.
La réponse dépend vraiment de la précision que vous essayez d'atteindre. Pour une précision supérieure à quelques secondes, le chronomètre est une meilleure approche en raison de l'utilisation d'un système de mesure plus précis que le datetime. Voir http://msdn.Microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
Du point de vue des performances, je doute qu'il y ait beaucoup de différence en voyant comment Start () et DateTime stockent maintenant les valeurs du système de mesure correspondant et lors de la récupération des millisecondes, il calcule la différence et convertit (au besoin) en l'unité de mesure correspondante
Je ne pense pas que ce soit vraiment important si vous ne l'appelez que quelques fois. Cependant, tout dépend de quel est le niveau de précision que vous demandez; Stopwatch
est beaucoup plus précis, car il s'appuie sur QueuePerformanceCounter
API, il utilise donc une résolution plus élevée.
Je pense que le second sera plus efficace en ce qui concerne les performances, et comme les liens dans le commentaire l'indiquent, si vous voulez mesurer le temps en dessous de secondes, DateTime ne sera pas précis, bien qu'il soit efficace
Je pense que oui parce que StopWatch mesurerait les ticks en continu par rapport à DateTime qui ne contiendra qu'une seule instance de DateTime, c'est-à-dire startTime.