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

J’ai besoin d’une timer précise, et DateTime.Now semble assez inexact. 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 quelque chose 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 la production.) Je n’essaye pas simplement d’utiliser un minuteur pour évaluer 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’parsing comparative et ne devrait pas être utilisé dans le code de la dissortingbution, bien qu’il n’y ait aucune raison donnée. Est-ce que c’est correct ou est-ce que je suis (et quiconque a posté ce conseil) trop fermé d’esprit à propos de System.Diagnostics? Par exemple, est-il possible d’utiliser System.Diagnostics.Stopwatch dans le code de production? Merci Adrian

Sous le capot, pratiquement tout ce que fait Stopwatch est wrap QueryPerformanceCounter . Si je comprends bien, Stopwatch est là pour fournir l’access à la timer haute résolution – si vous avez besoin de cette résolution dans le code de production, je ne vois rien de mal à l’utiliser.

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

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

D’autres choses, telles que la classe Trace , peuvent vous aider à retrouver des 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 la journalisation et le suivi de ce bogue insaisissable sur une machine distante.

Ne vous inquiétez pas pour le nom.

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 devez vous soucier 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”.

Afaik StopWatch est un shell sur la fonctionnalité QueryPerformanceCounter . 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, p Invitez directement le QPF.

Le chronomètre est fondamentalement un encapsuleur soigné autour des QueryPerformanceCounter natives QueryPerformanceCounter et QueryPerformanceFrequency . Si vous ne vous sentez pas à l’aise d’utiliser l’espace de noms System.Diagnostic , vous pouvez y accéder directement .

L’utilisation du compteur de performance est très courante, il n’y a rien de mal à cela. AFAIK, il n’y a pas de précision de timer supérieure disponible. Notez que le QPF peut entraîner des problèmes avec les machines à plusieurs processeurs , mais que l’article MSDN lié auparavant donne des informations supplémentaires à ce sujet. Il est conseillé de s’assurer que System.Diagnostics.Stopwatch fait en arrière-plan ou d’appeler manuellement SetThreadAffinity , sinon votre timer pourrait remonter dans le temps !

Notez que pour des mesures de très haute précision, certaines subtilités doivent être sockets en compte. Si vous avez besoin de beaucoup de précision, cela pourrait vous inquiéter.

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 timer dans la bibliothèque de classes .NET Framework).

En fonction de l’utilisation de la timer, vous pouvez avoir d’autres problèmes à prendre en compte. Windows ne fournit aucune garantie sur le délai d’exécution, vous ne devez donc pas vous y fier pour un traitement en temps réel (il existe des extensions en temps réel pour Windows qui permettent une planification en temps réel). Je soupçonne également que vous pourriez perdre de la précision à la suite du 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 de temps arbitrairement longue; en pratique, il devrait être de l’ordre de quelques millisecondes. Cela dépend vraiment de la nature critique de ce calendrier.