Export (0) Print
Expand All

How to: Use the High-Resolution Timer

Some devices support a high-resolution timer. This timer, when present, provides more precise measurements than you can obtain by using the TickCount property, which has a 1-millisecond resolution. In applications where precise time measurements are important, the high-resolution timer provides the best results. For example, some Direct3D applications display more smoothly when the animation is based on the high-resolution timer. You can also use this timer in an application to determine how much time a method or a section of code requires to execute.


This code example provides a class that makes it easier to use the high-resolution timer in managed code on Windows CE. The example has the following features:

  • Platform invoke declarations for the native methods in Windows CE.

  • A property that may be used to get the frequency of the high-resolution counter.

  • A property that may be used to get the value of the high-resolution counter.

  • An implementation that supports the TickCount property as a fallback if the QueryPerformanceCounter function is not supported or is emulated.

  • An example of how the high-resolution counter can be used to time an operation.

public class HiResTimer
    private bool isPerfCounterSupported = false;
    private Int64 frequency = 0;

    // Windows CE native library with QueryPerformanceCounter().
    private const string lib = "coredll.dll";
    private static extern int QueryPerformanceCounter(ref Int64 count);
    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;
            // The performance counter is not supported. Use
            // Environment.TickCount instead.
            frequency = 1000;

    public Int64 Frequency
            return frequency;

    public Int64 Value
            Int64 tickCount = 0;

            if (isPerfCounterSupported)
                // Get the value here if the counter is supported.
                QueryPerformanceCounter(ref tickCount);
                return tickCount;
                // 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++)

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

Compiling the Code

This example requires references to the following namespaces:

See Also

Community Additions

© 2015 Microsoft