web-dev-qa-db-fra.com

Le chronomètre peut-il être utilisé dans le code de production?

J'ai besoin d'une minuterie précise et DateTime.Now semble pas assez précis. D'après les descriptions que j'ai lues, System.Diagnostics.Stopwatch semble être exactement ce que je veux.

Mais j'ai une phobie. Je suis nerveux à l'idée d'utiliser quoi que ce soit de System.Diagnostics dans le code de production réel. (Je l'utilise abondamment pour le débogage avec Asserts et PrintLns, etc., mais jamais pour les tâches de production.) Je n'essaie pas simplement d'utiliser un minuteur pour comparer mes fonctions - mon application a besoin d'un minuteur réel. J'ai lu sur un autre forum que System.Diagnostics.StopWatch est uniquement destiné à l'analyse comparative et ne doit pas être utilisé dans le code de vente au détail, bien qu'aucune raison n'ait été donnée. Est-ce correct, ou suis-je (et celui qui a publié ce conseil) trop fermé d'esprit à propos de System.Diagnostics? c'est-à-dire, est-il correct d'utiliser System.Diagnostics.Stopwatch dans le code de production? Merci Adrian

74
Adrian

Sous le capot, à peu près tout ce que le chronomètre fait est de boucler QueryPerformanceCounter . Si je comprends bien, le chronomètre est là pour donner accès au minuteur haute résolution - si vous avez besoin de cette résolution dans le code de production, je ne vois rien de mal à l'utiliser.

59
Steve Dennis

Oui, System.Diagnostics semble être uniquement pour le débogage, mais ne laissez pas le nom vous tromper. Le System.Diagnostics l'espace de noms peut sembler un peu effrayant pour une utilisation dans le code de production au début (il l'a fait pour moi), mais il y a beaucoup de choses utiles dans cet espace de noms.

Certaines choses, comme la classe Process, sont utiles pour interagir avec le système. Avec Process.Start vous pouvez démarrer d'autres applications, lancer un site Web pour l'utilisateur, ouvrir un fichier ou un dossier, etc.

D'autres choses, comme la classe Trace, peuvent vous aider à localiser les bogues dans le code de production. Certes, vous ne les utiliserez pas toujours dans le code de production, mais ils sont très utiles pour enregistrer et localiser ce bug insaisissable sur une machine distante.

Ne vous inquiétez pas du nom.

23
Zach Johnson

Vous dites que vous avez lu sur un autre forum pour ne pas utiliser les classes de System.Diagnostics en production. Mais la seule source dont vous devriez vous inquiéter est Microsoft, qui a créé le code. Ils disent que la classe StopWatch :

Fournit un ensemble de méthodes et de propriétés que vous pouvez utiliser pour mesurer avec précision le temps écoulé.

Ils ne disent pas "sauf en production".

5
John Saunders

Afaik StopWatch est un Shell sur QueryPerformanceCounter fonctionnalité. Cette fonction est à la base de nombreuses mesures liées aux compteurs de performance. QPF est très rapide à appeler et parfaitement sûr. SI vous vous sentez paranoïaque à propos de l'espace de noms Diagnostics, appelez directement le QPF.

4
Remus Rusanu

Le chronomètre est en gros un emballage soigné autour des méthodes natives QueryPerformanceCounter et QueryPerformanceFrequency. Si vous ne vous sentez pas à l'aise avec le System.Diagnostic espace de noms, vous pouvez accéder directement à ceux-ci .

L'utilisation du compteur de performances est très courante, il n'y a rien de mal à cela. AFAIK, il n'y a pas de précision de minuterie plus élevée disponible. Notez que le QPF peut entraîner des problèmes avec les machines multiprocesseurs , mais l'article MSDN lié avant donne quelques informations supplémentaires à ce sujet. Il est conseillé de s'assurer que System.Diagnostics.Stopwatch fait cela en arrière-plan ou pour appeler manuellement le SetThreadAffinity - sinon votre temporisateur pourrait remonter dans le temps !

Notez que pour les mesures de très haute précision, il y a certaines subtilités qui doivent être prises en compte. Si vous avez besoin de tant de précision, cela pourrait vous inquiéter.

3
mnemosyn

Il existe plusieurs classes de temporisation différentes dans la bibliothèque de classes de base .NET - celle qui convient le mieux à vos besoins ne peut être déterminée que par vous.

Voici un bon article du magazine MSDN sur le sujet (Comparaison des classes de temporisation dans la bibliothèque de classes .NET Framework).

3
Oded

Selon l'utilisation que vous faites de la minuterie, vous pouvez avoir d'autres problèmes à considérer. Windows ne fournit aucune garantie sur le calendrier d'exécution, vous ne devez donc pas vous y fier pour tout traitement en temps réel (il existe des extensions en temps réel pour Windows qui fournissent une planification en temps réel difficile). Je soupçonne également que vous pourriez perdre de la précision à la suite d'un changement de contexte après avoir capturé l'intervalle de temps et avant de faire quelque chose qui dépend de sa précision. En principe, cela pourrait être une période arbitrairement longue; en pratique, elle devrait être de l'ordre des millisecondes. Cela dépend vraiment de l'importance critique de ce calendrier.

0
Dan Bryant