2011-08-08 6 views
31

Doublons possibles:
Is DateTime.Now the best way to measure a function's performance?
Stopwatch vs. using System.DateTime.Now for timing events.NET Chronomètre - pénalité de performance

J'ai le code qui doit courir aussi vite que possible. Pour pouvoir enregistrer l'heure d'exécution, j'utilise la classe Stopwatch. Je suppose que Stopwatch peut affecter la performance d'une mauvaise façon. Peut-être que l'utilisation d'une différence DateTime peut être plus efficace?

À votre avis, quelle est la meilleure performance?

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
int a = 5; 

// Critical lines of code 

long elapsedMs = se.Elapsed.TotalMilliseconds; 

OU

DateTime startDate = DateTime.Now; 
int a = 5; 

// Critical lines of code 

long elapsedMs = DateTime.Now.Subtract(startDate).TotalMilleseconds; 
+4

Je doute fortement que l'utilisation vous donnera les mêmes résultats. Différences sans conséquence. –

+1

Voir http://stackoverflow.com/questions/2923283/stopwatch-vs-using-system-datetime-now-for-timing-events – ccellar

+1

Voir: http://stackoverflow.com/questions/28637/is-datetime- now-the-best-way-to-mesure-a-functions-performance-tl; dr: Utilisez le chronomètre. –

Répondre

43

Le Stopwatch ne fait rien entre les appels à Start et Stop ... Il stocke simplement l'horodatage en cours (via QueryPerformanceCounter) lorsque vous démarrez, et le compare à l'horodatage en cours lorsque vous l'arrêtez. Il n'y a donc aucune raison pour que cela affecte les performances de votre code, du moins pas de manière significative. Stopwatch a été conçu spécifiquement pour des mesures de temps précises, de sorte que vous pouvez être sûr qu'il est complètement optimisé. Il est également beaucoup plus précis que la comparaison des valeurs successives de DateTime.Now. ...

+1

La question est également de savoir ce que fait le chronomètre à l'intérieur des appels Start() et Stop() et comment cela affecte l'application. VS2013 Performance Analyzer montre que le Stopwatch.Stop() perd environ 0,92% (l'application fait 80000 requêtes SQL, 1thread, sw.Start()/sw.Stop() avant chaque) – mistika

+0

L'explication que je cherchais. – Neo

1

Je pense que le second sera plus efficace dans la mesure où la performance est concerné, et que les liens dans le commentaire indiquent, si vous voulez mesurer le temps ci-dessous secondes puis DateTime ne sera pas précis bien qu'il serait efficace

Je pense que parce que StopWatch mesurerait les ticks continuellement comparé à DateTime qui ne contiendra qu'une seule instance de DateTime, c'est-à-dire startTime.

+1

Souciez-vous de clarifier? – ChaosPandion

+0

+1 pour la première phrase qui est correcte. Obtenir DateTime actuel est juste sur la lecture d'un compteur de la mémoire. Cependant, comme vous le dites, la performance n'est pas la bonne métrique à prendre en compte ici, sa précision. – nawfal

8

Puisque votre code de profilage n'est exécuté qu'une seule fois, son impact sur les performances devrait être négligeable. C'est seulement un problème si vous mettez des appels au chronomètre à l'intérieur de votre boucle interne/chemins de code critiques.

GetTickCount() devrait être l'un des moyens les plus rapides de profil, mais il a seulement une précision de quelques millisecondes. La fonction API Windows GetTickCount() vérifie uniquement une variable simple (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 dans .NET. Mais comme je l'ai dit, je doute que cela compte. DateTime.UtcNow/Now ont la même (faible) précision que GetTickCount.

En théorie, il pourrait y avoir un effet sur la gigue, mais c'est peu probable.

1

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, donc il utilise une résolution plus élevée.

1

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 grâce à l'utilisation d'un système de mesure plus précis que le chronomètre. Voir http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Du point de vue de la performance, je doute qu'il y ait beaucoup d'une différence de voir comment le départ() et DateTime.Now stockent les valeurs du système de mesure correspondant et lors de la récupération des millisecondes il calcule la différence et convertit (selon les besoins) en l'unité de mesure correspondante

Questions connexes