Compartilhar via


Como: Use o Timer High-resolução

Alguns dispositivos oferecem suporte a um timer de alta resolução.Este timer, quando presentes, fornece medidas mais precisas que você pode obter usando o TickCount propriedade, que possui uma resolução 1 milissegundos. Em aplicativos onde medições de time preciso são importantes, o timer de alta resolução fornece os melhores resultados.Por exemplo, alguns aplicativos Direct3D exibem mais suave quando a animação se baseia o timer de alta resolução.Você também pode usar este timer em um aplicativo para determinar quanto time um método ou uma seção de código requer para executar.

Exemplo

Este exemplo de código fornece uma classe que torna mais fácil de usar o timer de alta resolução em código gerenciado no Windows CE.O exemplo tem os seguintes recursos:

  • Declarações de invocação de plataforma para os métodos nativo em Windows CE.

  • Uma propriedade que é usada para obter a freqüência do contador de alta resolução.

  • Uma propriedade que é usada para obter o valor do contador de alta resolução.

  • Uma implementação que oferece suporte a TickCount a propriedade sistema autônomo um fallback se o QueryPerformanceCounter função não é suportada ou é emulada.

  • Um exemplo de como o contador de alta resolução pode ser usado para uma operação de time.

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);
    }
}

Compilando o código

Este exemplo requer referências aos seguintes namespaces:

Consulte também

Outros recursos

Criação de aplicativos e tarefas Core in the .NET Compact estrutura

Interoperabilidade no .NET Compact Framework