通常はストップウォッチを使用しますが、kernel32.dll に対しても p/invoke を使用しています。
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
Start() と Stop() という 2 つのメソッドがあります。
public void Start()
{
Thread.Sleep(0);
QueryPerformanceCounter(out startTime);
}
public void Stop()
{
QueryPerformanceCounter(out stopTime);
}
Start() と Stop() の呼び出し間の期間を照会するには:
public double Duration
{
get
{
return (double)(stopTime - startTime)*1000 / (double)freq;
}
}
freq
コンストラクターで決定されることに注意してください。
public PerformanceTimer()
{
startTime = 0;
stopTime = 0;
if (QueryPerformanceFrequency(out freq) == false)
{
// not supported
throw new Win32Exception();
}
}
私のニーズでは、あまり違いに気づきませんでしたが、両方を試して、自分に合ったものを確認することをお勧めします.
編集: MSDN から元のコードを見つけることができました。.Net 1.1 以降、いくつかの改善が行われたようです。持ち帰りのメッセージは、この方法がナノ秒の精度を提供すると Microsoft が主張しているということです。