Comment : utiliser la minuterie haute résolution
Mise à jour : novembre 2007
Certains périphériques prennent en charge une minuterie haute résolution. Cette minuterie, lorsqu'elle existe, fournit des mesures plus précises que celles que vous pouvez obtenir à l'aide de la propriété TickCount, qui présente une résolution de 1 milliseconde. Dans les applications où la précision des mesures temporelles est importante, la minuterie haute résolution fournit les meilleurs résultats. Par exemple, l'affichage de certaines applications Direct3D est plus souple lorsque l'animation est basée sur la minuterie haute résolution. Vous pouvez également utiliser cette minuterie dans une application pour déterminer le temps requis pour l'exécution d'une méthode ou d'une section de code.
Exemple
Cet exemple de code fournit une classe qui simplifie l'utilisation de la minuterie haute résolution dans le code managé sous Windows CE. L'exemple illustre les fonctionnalités suivantes :
Déclarations d'appel de code non managé pour les méthodes natives dans Windows CE.
Propriété pouvant être utilisée pour obtenir la fréquence du compteur haute résolution.
Propriété pouvant être utilisée pour obtenir la valeur du compteur haute résolution.
Implémentation prenant en charge la propriété TickCount comme secours si la fonction QueryPerformanceCounter n'est pas prise en charge ou est émulée.
Exemple de l'utilisation du compteur haute résolution pour chronométrer une opération.
Public Class HiResTimer
Private isPerfCounterSupported As Boolean = False
Private timerFrequency As Int64 = 0
' Windows CE native library with QueryPerformanceCounter().
Private Const [lib] As String = "coredll.dll"
Public Declare Function QueryPerformanceCounter Lib "Coredll.dll" _
(ByRef count As Int64) As Integer
Public Declare Function QueryPerformanceFrequency Lib "Coredll.dll" _
(ByRef timerFrequency As Int64) As Integer
Public Sub New()
' Query the high-resolution timer only if it is supported.
' A returned frequency of 1000 typically indicates that it is not
' supported and is emulated by the OS using the same value that is
' returned by Environment.TickCount.
' A return value of 0 indicates that the performance counter is
' not supported.
Dim returnVal As Integer = QueryPerformanceFrequency(timerFrequency)
If returnVal <> 0 AndAlso timerFrequency <> 1000 Then
' The performance counter is supported.
isPerfCounterSupported = True
Else
' The performance counter is not supported. Use
' Environment.TickCount instead.
timerFrequency = 1000
End If
End Sub
Public ReadOnly Property Frequency() As Int64
Get
Return timerFrequency
End Get
End Property
Public ReadOnly Property Value() As Int64
Get
Dim tickCount As Int64 = 0
If isPerfCounterSupported Then
' Get the value here if the counter is supported.
QueryPerformanceCounter(tickCount)
Return tickCount
Else
' Otherwise, use Environment.TickCount
Return CType(Environment.TickCount, Int64)
End If
End Get
End Property
Shared Sub Main()
Dim timer As New HiResTimer()
' This example shows how to use the high-resolution counter to
' time an operation.
' Get counter value before the operation starts.
Dim counterAtStart As Int64 = timer.Value
' Perform an operation that takes a measureable amount of time.
Dim count As Integer
For count = 0 To 9999
count += 1
count -= 1
Next count
' Get counter value after the operation ends.
Dim counterAtEnd As Int64 = timer.Value
' Get time elapsed in tenths of milliseconds
Dim timeElapsedInTicks As Int64 = counterAtEnd - counterAtStart
Dim timeElapseInTenthsOfMilliseconds As Int64 = timeElapsedInTicks * 10000 / timer.Frequency
MessageBox.Show("Time Spent in operation (tenths of ms) " + timeElapseInTenthsOfMilliseconds.ToString + vbLf + "Counter Value At Start: " + counterAtStart.ToString + vbLf + "Counter Value At End : " + counterAtEnd.ToString + vbLf + "Counter Frequency : " + timer.Frequency.ToString)
End Sub
End Class
public class HiResTimer
{
private bool isPerfCounterSupported = false;
private Int64 frequency = 0;
// Windows CE native library with QueryPerformanceCounter().
private const string lib = "coredll.dll";
[DllImport(lib)]
private static extern int QueryPerformanceCounter(ref Int64 count);
[DllImport(lib)]
private static extern int QueryPerformanceFrequency(ref Int64 frequency);
public HiResTimer()
{
// Query the high-resolution timer only if it is supported.
// A returned frequency of 1000 typically indicates that it is not
// supported and is emulated by the OS using the same value that is
// returned by Environment.TickCount.
// A return value of 0 indicates that the performance counter is
// not supported.
int returnVal = QueryPerformanceFrequency(ref frequency);
if (returnVal != 0 && frequency != 1000)
{
// The performance counter is supported.
isPerfCounterSupported = true;
}
else
{
// The performance counter is not supported. Use
// Environment.TickCount instead.
frequency = 1000;
}
}
public Int64 Frequency
{
get
{
return frequency;
}
}
public Int64 Value
{
get
{
Int64 tickCount = 0;
if (isPerfCounterSupported)
{
// Get the value here if the counter is supported.
QueryPerformanceCounter(ref tickCount);
return tickCount;
}
else
{
// Otherwise, use Environment.TickCount.
return (Int64)Environment.TickCount;
}
}
}
static void Main()
{
HiResTimer timer = new HiResTimer();
// This example shows how to use the high-resolution counter to
// time an operation.
// Get counter value before the operation starts.
Int64 counterAtStart = timer.Value;
// Perform an operation that takes a measureable amount of time.
for (int count = 0; count < 10000; count++)
{
count++;
count--;
}
// Get counter value when the operation ends.
Int64 counterAtEnd = timer.Value;
// Get time elapsed in tenths of a millisecond.
Int64 timeElapsedInTicks = counterAtEnd - counterAtStart;
Int64 timeElapseInTenthsOfMilliseconds =
(timeElapsedInTicks * 10000) / timer.Frequency;
MessageBox.Show("Time Spent in operation (tenths of ms) "
+ timeElapseInTenthsOfMilliseconds +
"\nCounter Value At Start: " + counterAtStart +
"\nCounter Value At End : " + counterAtEnd +
"\nCounter Frequency : " + timer.Frequency);
}
}
Compilation du code
Cet exemple nécessite des références aux espaces de noms suivants :
Voir aussi
Autres ressources
Génération d'applications et de tâches principales dans le .NET Compact Framework