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

标签 c# performance performancecounter

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

我使用秒表记录方法执行的持续时间,然后我首先将总毫秒数记录为 double ,然后我将秒表的 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 中显示的是一组不同的值。

比如……List of milliseconds中记录的两个值是:

23322.675, 14230.614

PerfMon 图中出现的是:

15.546, 9.930

有人可以解释一下吗?

最佳答案

一些猜测。

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

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

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

关于c# - Windows 性能监视器中的性能计数器计时器值不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2459592/

相关文章:

java - 您是否通过将方法内变量声明为属性来节省垃圾收集器的工作?

jQuery DOM 操作效率 - 使用 JavaScript 构建整个页面

performance - 为什么修改指令会导致 x86 上的大量 i-cache 和 i-TLB 未命中?

c++ - 使用性能计数器获取正常运行时间的权限问题

c# - Outlook VSTO 加载项 C# 事件 - 一段时间后不再触发事件

c# - C# 和 VB 中的 Overridable 和 Override

c# - MSDTC - 与底层事务管理器的通信失败

performance - 为什么内存拷贝第一次运行很慢?

Windows 性能计数器限制

c# - 带有 SAML 2.0 的 WIF(Windows Identity Foundation)