代码之家  ›  专栏  ›  技术社区  ›  krisg

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

  •  2
  • krisg  · 技术社区  · 15 年前

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

    我正在使用秒表记录方法执行的持续时间,然后首先将总毫秒数记录为两倍,然后传递秒表的时间跨度。将计时标记传递给性能监视器中要记录的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();
    

    …其中“timing”是秒表的TimeSpan.ticks值。

    当运行此命令时,double的集合(即秒表时间跨度的毫秒值)显示一组值,但在perfmon中显示的是一组不同的值。

    例如。。。毫秒列表中记录的两个值是:

    23322.675、14230.614

    在PerfMon图中出现的是:

    15.546,9.930

    有人能解释一下吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Mike Two    15 年前

    一些猜测。

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

    您为列表指定了毫秒,但为性能计数器指定了刻度。一个刻度是100纳秒,即0.0001毫秒。我本以为你的尺寸会被颠倒,比如Perfmon得到14230.614,列表得到15.546,但这仍然会减少一个数量级。

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