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

Posted

技术标签:

【中文标题】Windows 性能监视器中的性能计数器计时器值不准确【英文标题】:Inaccurate performance counter timer values in Windows Performance Monitor 【发布时间】:2010-03-17 02:38:30 【问题描述】:

我正在应用程序中实现检测,但遇到了一个问题,即从 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

有人可以解释一下吗?

【问题讨论】:

@krisg - 你能显示将条目放入毫秒列表的代码吗? 【参考方案1】:

一些猜测。

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

您说列表的毫秒数,但是性能计数器的刻度。一个滴答声是 100 纳秒,即 0.0001 毫秒。我本来预计你必须颠倒的大小,例如 perfmon 得到 14230.614 和 list 得到 15.546,但这仍然会相差一个数量级。

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

【讨论】:

请在此处阅读:codeproject.com/KB/system/monitorserviceperformance.aspx,其中指出 AverageTimer32 仅通过平均记录的最后 2 个值在 PerfMon 中生成一个值。这可能是不同值问题的原因。至于数量级,我猜虽然您以刻度传递 PerfMon 时间,但它以更“人性化”的秒格式显示它。不过这只是猜测。 无论如何都标记为答案,因为它至少为我提供了一些启示;)

以上是关于Windows 性能监视器中的性能计数器计时器值不准确的主要内容,如果未能解决你的问题,请参考以下文章

Windows 性能监视器API

Windows 性能监视器API

Windows 性能监视器API

在Windows上保存性能监视器中添加的内容

Windows性能计数器分析性能监视器的使用

PowerBI分析Windows性能计数器的数据