C# で使える精度の高いタイマー

DateTime.Now とか、Environment.TickCount とか、これらの精度は、せいぜい15~16 ms 程度。
もっと精度が欲しい事もある。
そんなときは、Kernel32 の QueryPerformanceCounter と QueryPerformanceFrequency を使うとよろしい。詳しくは検索すると出てくる。
このクラスは、上記の API をラップしたもの。

using System;
using System.Runtime.InteropServices;
using System.Threading;

public class MyTimer
{
    [DllImport("Kernel32.DLL")]
    private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
    [DllImport("Kernel32.DLL")]
    private static extern bool QueryPerformanceFrequency(out long lpFrequency);

    private long startTime;
    private long stopTime;
    private long freq;

    public MyTimer()
    {
        startTime = 0;
        stopTime = 0;
        if (QueryPerformanceFrequency(out freq) == false)
        {
            throw new Exception();
        }
    }

    public void Start()
    {
        Thread.Sleep(0);
        QueryPerformanceCounter(out startTime);
    }

    public void Stop()
    {
        QueryPerformanceCounter(out stopTime);
    }

    public double Duration
    {
        get
        {
            return (stopTime - startTime) * 1000.0 / freq;
        }
    }
}

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください