假设我有一个方法Foo(),我想测量执行哪种类型的Windows性能计数器所需的时间(以毫秒为单位)?
var stopwatch = new Stopwatch();
stopwatch.Start();
Foo();
stopwatch.Stop();
counter.RawValue = stopwatch.TotalMilliseonds;
目前我正在使用NumberOfItems64但是除非执行新操作,否则它会持续计数器的最后一个值。这是可取的吗?或者,一旦操作完成,计数器是否应该变为零?在这种情况下你会选择哪种柜台类型?为什么?
答案 0 :(得分:7)
这听起来像 AverageTimer32 的好候选人。有关详细信息,请参阅this SO answer。
答案 1 :(得分:1)
要添加到上一个答案,CodeProject上的预制和定制性能计数器都有very good article。
答案 2 :(得分:0)
我通常使用秒表,但我也使用了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();
}
}
根据我的需要,我没有发现太多差异,虽然我建议你们两个都试着看看什么适合你。
编辑:我找到了original code from MSDN。似乎自.Net 1.1以来有一些改进。带回家的消息是Microsoft 声明该方法提供纳秒精度。
答案 3 :(得分:0)