Windows性能监视器中不正确的性能计数器计时器值

时间:2010-03-17 02:38:30

标签: c# performance performancecounter

我正在应用程序中实现检测,并且遇到了一个问题,即PerformanceCounter中Windows性能监视器中显示的值与记录的值不一致。

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

在perfmon中创建性能计数器:

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值。

当它运行时,Double的集合(秒表的TimeSpan的毫秒值)显示一组值,但PerfMon中出现的是一组不同的值。

例如......列在毫秒列表中的两个值是:

23322.675,14230.614

PerfMon图中显示的是:

15.546,9.930

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:2)

一些猜测。

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

你说列表的毫秒数,但是性能计数器的滴答声。刻度是100纳秒,即0.0001毫秒。我本来期望你可以扭转的尺寸,例如perfmon得到14230.614,列表得到15.546,但仍然会有一个数量级。

答案不多,但不符合评论。