Quelle est la précision du Système.Diagnostics.Chronomètre?
Quelle est la précision Système.Diagnostics.Chronomètre? Je suis en train de faire quelques mesures pour les différents chemins de code et j'ai besoin d'elle pour être exact. Dois-je utiliser un chronomètre ou est-il une autre solution qui est plus précis.
J'ai été dit que, parfois, chronomètre donne des informations incorrectes.
- Est une précision à la milliseconde assez? Doit être suffisante pour vos besoins. Définir "exactes".
- je sais qu'il peut vous donner millisecondes, mais on m'a dit qu'il y a de nombreux cas où ce n'est pas précis
- Ne jamais se fier à une seule mesure de rien pour plus de précision. L'exécution de chaque chemin de code pendant plusieurs minutes et compter le nombre d'itérations pour obtenir une moyenne.
- Merci pour la question. Je ne savais même pas que il y avait une telle classe dans le cadre jusqu'à maintenant. Heh.
- J'ai écrit un article à ce sujet. Il montre comment vous obtenez de bons résultats de mesures de l'chronomètre de la classe: codeproject.com/KB/testing/stopwatch-measure-precise.aspx
- BTW, puisque c'est une très vieille question, maintenant, dans les plus récents .Filets en cours d'exécution sur un matériel plus récent, le chronomètre de précision est beaucoup mieux, parce que (comme Lee Grisholm dit dans un commentaire sur Kernelman de réponse), il est maintenant un wrapper autour de QueryPerformanceCounter.
Vous devez vous connecter pour publier un commentaire.
Pourquoi vous n'avez pas le profil de votre code au lieu de se concentrer sur les micro-benchmarks?
Il ya quelques bonnes Open Source profileurs comme:
Je viens d'écrire un article qui explique comment une configuration de test doit être fait pour obtenir une précision élevée (supérieure à 0,1 ms) sur le chronomètre. Je Pense qu'il devrait tout expliquer.
http://www.codeproject.com/KB/testing/stopwatch-measure-precise.aspx
Le Système.Diagnostics.Chronomètre classe ne comprend mesurer avec précision le temps écoulé, mais la manière dont la ElapsedTicks œuvres méthode a conduit certaines personnes à la conclusion qu'elle n'est pas exacte, quand ils en ont vraiment juste une erreur de logique dans leur code.
La raison que certains développeurs pensent que le Chronomètre n'est pas exact, c'est que le ElapsedTicks de le Chronomètre NE correspondent PAS à la Tiques dans un DateTime.
Le problème se pose lorsque le code de l'application utilise le ElapsedTicks pour créer un nouveau DateTime.
Si nécessaire, le chronomètre la durée peut être converti en type DateTime de la manière suivante:
Voici un article qui explique le problème plus en détail:
http://geekswithblogs.net/BlackRabbitCoder/archive/2012/01/12/c.net-little-pitfalls-stopwatch-ticks-are-not-timespan-ticks.aspx
Chronomètre-retour en classe, les différentes valeurs sous différentes configuration de la Fréquence dépend du matériel installé & système d'exploitation.
Utilisation du chronomètre de classe que nous pouvons avoir seulement l'estimation des temps d'exécution. Et pour chaque exécution, il renvoie une valeur différente, donc nous devons prendre en moyenne d'exécution différents.
Plus D'Infos : http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
D'abord, exacte est bien sûr pas possible dignes de ce concept quand on parle de temps ou d'espace, car aucun empyrical la mesure d'une grandeur physique ne peut jamais prétendre être exact.
Deuxième, David Boltons'article de blog peut être utile. Je cite:
Si vous voulez plus précises à ce sujet. Jetez un oeil à la QueryPerformanceCounter. MSDN lien pour QueryPerformanceCounter. Soigné de la mise en œuvre est donné ici. L'exemple des charges coredll.dll pour CE, pour Windows, vous devez charger le Kernel32.dll comme indiqué dans la documentation MSDN.
MSDN a quelques exemples du chronomètre. Ils ont également il en montrant comment elle est exacte au sein de Nanosecondes. Espérons que cette aide!
En plus d'appuyer les conseils de HUAGHAGUAH ci-dessus, j'ajouterais que vous devriez être TRÈS sceptique sur les micro-benchmarks en général. Alors que près axée tests de performance a une place légitime, il est très facile d'ajuster un détail sans importance. Afin d'écrire et vérifier le code qui est conçue pour des raisons de lisibilité et de clarté, puis profil pour trouver les points chauds (ou s'il y sont toute la peine de s'inquiéter au sujet), puis réglez la (seule) de ces parties.
Je me souviens de travail avec un programmeur qui micro-optimisé un peu de code exécutée alors que le système attendu pour un apport humain. Le gain de temps absolument disparu dans l'entre-frappe décalage horaire!