我通常使用秒表,但我也使用 p/invoke 到 kernel32.dll:
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
我有两个方法称为 Start() 和 Stop():
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 以来似乎有一些改进。带回家的消息是,微软声称这种方法可以提供纳秒级的精度。