2010-03-17 162 views
2

我在应用程序内部实施检测,并遇到以下问题:Performance Performance Monitor中显示的值与PerformanceCounter中记录的值不一致。Windows性能监视器中的性能计数器计时器值不准确

我正在使用秒表记录方法执行的持续时间,然后首先将总毫秒记录为双精度,其次我将秒表的TimeSpan.Ticks传递给PerformanceCounter以记录在性能监视器中。

在性能监视器创建性能计数器:

var datas = new CounterCreationDataCollection(); 
datas.Add(new CounterCreationData 
{ 
    CounterName = name, 
    CounterType = PerformanceCounterType.AverageTimer32 
}); 

datas.Add(new CounterCreationData 
{ 
    CounterName = namebase, 
    CounterType = PerformanceCounterType.AverageBase 
}); 

PerformanceCounterCategory.Create("Category", "performance data", 
    PerformanceCounterCategoryType.SingleInstance, datas); 

然后记录我检索收集和增量预初始化计数器:

_counters[counter].IncrementBy(timing); 
_counters[counterbase].Increment(); 

...其中,“时间”是秒表的TimeSpan.Ticks值。

当这个运行时,秒的集合,即Stopwatch的TimeSpan的毫秒值显示一组值,但PerfMon中出现的是一组不同的值。

例如...记录以毫秒为单位的名单两个值:

23322.675,14230.614

显示内容在性能监视器图表有:

15.546,9.930

灿有人解释这一点吗?

+0

@krisg - 你可以显示将条目放入毫秒列表的代码吗? – 2010-03-18 09:04:27

回答

2

有几个猜测。您正在使用PerformanceCounterType.AverageTimer32。这是平均的时间。也有可能您没有在每个方法调用中重新设置Stopwatch,因此您在列表中存储的值是对该方法的每次调用到目前为止的总运行时间。

你说的毫秒为列表,但为性能计数器打勾。刻度是100纳秒,即0.0001毫秒。我希望你能够扭转的大小,比如perfmon得到14230.614,列表得到15.546,但这个数字仍然会下降一个数量级。

没有太多的答案,但它不适合评论。

+0

哈哈不,它不是秒表:P – krisg 2010-03-22 00:46:42

+0

只需阅读这里:http://www.codeproject.com/KB/system/monitorserviceperformance.aspx其中指出AverageTimer32通过平均只记录最后2个值在PerfMon中生成一个值。这可能是不同价值观问题的原因。至于数量级,我猜测虽然你在传递PerfMon时间,但它以更“人性化”的秒数显示。这只是一个猜测。 – krisg 2010-03-22 01:04:42

+0

无论如何都标记为答案,因为它为我提供了至少一点点启蒙;) – krisg 2010-03-22 01:10:29