Chronomètre vs utiliser System.DateTime.Now pour les événements de synchronisation

Je voulais suivre les performances de mon code, donc j’ai stocké l’heure de début et de fin à l’aide de System.DateTime.Now . J’ai pris la différence entre les deux comme le temps mon code à exécuter.

J’ai cependant remarqué que la différence ne semblait pas être exacte. J’ai donc essayé d’utiliser un object Stopwatch . Cela s’est avéré beaucoup, beaucoup plus précis.

Quelqu’un peut-il me dire pourquoi Stopwatch serait plus précis que de calculer la différence entre une heure de début et de fin en utilisant System.DateTime.Now ?

BTW, je ne parle pas d’un dixième de pour cent. J’ai environ 15-20% de différence.

    Selon MSDN :

    Le chronomètre mesure le temps écoulé en comptant les graduations du temporisateur sous-jacent. Si le matériel et le système d’exploitation installés prennent en charge un compteur de performances haute résolution, la classe Chronomètre utilise ce compteur pour mesurer le temps écoulé. Sinon, la classe Chronomètre utilise le minuteur du système pour mesurer le temps écoulé. Utilisez les champs Frequency et IsHighResolution pour déterminer la précision et la résolution de l’implémentation du chronomètre.

    Il utilise une résolution / précision supérieure à celle de DateTime.Now .

    Vous pouvez également consulter ces liens connexes:

    Environment.TickCount vs DateTime.Now

    Est-ce que DateTime.Now est le meilleur moyen de mesurer les performances d’une fonction?

    DateTime est assez bon pour la précision à la seconde probablement, mais rien de plus que je recommanderais StopWatch .

    Il est préférable d’utiliser la classe Stopwatch car elle est beaucoup plus précise que la soustraction des valeurs DateTime:

     Stopwatch s = Stopwatch.StartNew(); // Tested code here s.Stop(); Console.WriteLine("Elapsed Time: {0} ms", s.ElapsedMilliseconds); 

    Malheureusement, ce simple code ne suffira pas à obtenir des mesures précises la plupart du temps, car il y a beaucoup d’activité sous le capot du système d’exploitation, ce qui peut voler du temps processeur et ralentir l’exécution de votre code. C’est pourquoi il est préférable d’exécuter les tests plusieurs fois, puis de supprimer les temps les plus bas et les plus élevés. Pour cela, il est préférable d’avoir une méthode qui exécute le code testé plusieurs fois, supprime les temps les plus bas et les plus grands et calcule le temps moyen. J’ai publié une méthode de test sur mon blog .

    ce lien de performance de la fonction de temporisation traite de votre problème exact, en particulier de ce paragraphe:

    Le problème est que, selon MSDN, la résolution de la fonction DateTime.Now est de 10 millisecondes et que nous devons l’appeler deux fois! Donc, cela introduirait un swing de plus de 20 ms dans votre mesure d’exécution. Comme nos appels de fonctions sont souvent beaucoup plus rapides à retourner que cette fenêtre de 20 ms, cela ne suffit pas.

    EDIT: Cela ressemble à la deuxième DateTime.Now est appelé à un moment différent que lorsque la méthode du chronomètre se termine.