Une mesure précise du temps est cruciale pour diverses tâches de programmation, de la journalisation des événements à la mesure des performances. Si les secondes suffisent souvent, de nombreuses applications exigent une précision à la milliseconde pour un chronométrage précis. Cet article explore comment y parvenir en C#.
Table des matières
- Notions fondamentales sur la date et l’heure en C#
- Travailler avec les millisecondes en C#
- Exemples pratiques : obtenir les millisecondes
- Choisir la bonne méthode
Notions fondamentales sur la date et l’heure en C#
C# offre une gestion robuste de la date et de l’heure grâce aux structures DateTime
et DateTimeOffset
. Celles-ci fournissent diverses propriétés et méthodes pour manipuler les informations de date et d’heure. Cependant, l’accès direct aux millisecondes nécessite une compréhension plus approfondie de ces outils.
Travailler avec les millisecondes en C#
Le concept principal réside dans la compréhension de la propriété Ticks
. Une structure DateTime
représente un point dans le temps, et Ticks
renvoie le nombre d’intervalles de 100 nanosecondes depuis minuit, le 1er janvier 0001. Pour obtenir les millisecondes, nous divisons la valeur Ticks
par TimeSpan.TicksPerMillisecond
(10 000).
Exemples pratiques : obtenir les millisecondes
Méthode 1 : Utilisation de DateTime.Now.Ticks
Il s’agit de l’approche la plus simple pour obtenir l’heure actuelle en millisecondes :
using System;
public class MillisecondsExample
{
public static void Main(string[] args)
{
long ticks = DateTime.Now.Ticks;
long milliseconds = ticks / TimeSpan.TicksPerMillisecond;
Console.WriteLine($"Heure actuelle en millisecondes : {milliseconds}");
}
}
Méthode 2 : Utilisation de Stopwatch
pour le temps écoulé
La classe Stopwatch
excelle dans la mesure du temps écoulé, offrant une meilleure précision pour les courtes durées par rapport à l’utilisation directe de DateTime.Now
. Ceci est idéal pour l’évaluation comparative des performances.
using System;
using System.Diagnostics;
public class StopwatchExample
{
public static void Main(string[] args)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
// Code à chronométrer…
System.Threading.Thread.Sleep(500); // Simule un travail
stopwatch.Stop();
long milliseconds = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"Temps écoulé en millisecondes : {milliseconds}");
}
}
Méthode 3 : Minuteur haute résolution (pour les besoins avancés)
Pour une précision extrême, considérez l’API QueryPerformanceCounter
. Cependant, n’oubliez pas que cela dépend de la plateforme et que la précision varie en fonction du matériel. Ce n’est généralement pas nécessaire, sauf si vous avez besoin d’une précision à la microseconde ou à la nanoseconde.
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class HighResolutionTimerExample
{
public static void Main(string[] args)
{
long frequency;
long startTime;
long endTime;
QueryPerformanceFrequency(out frequency);
QueryPerformanceCounter(out startTime);
// Code à chronométrer…
System.Threading.Thread.Sleep(500); // Simule un travail
QueryPerformanceCounter(out endTime);
long elapsedTicks = endTime - startTime;
double elapsedMilliseconds = (double)elapsedTicks / frequency * 1000;
Console.WriteLine($"Temps écoulé en millisecondes : {elapsedMilliseconds}");
}
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
}
Choisir la bonne méthode
Choisissez la méthode la mieux adaptée aux besoins de votre application. Pour la plupart des scénarios, DateTime.Now.Ticks
ou Stopwatch
offre une précision suffisante. N’utilisez QueryPerformanceCounter
que lorsque la précision extrême (microsecondes ou nanosecondes) est absolument nécessaire.