2

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

运行时,双精度值的集合(秒表 TimeSpan 的毫秒值)显示一组值,但出现在 PerfMon 中的是一组不同的值。

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

23322.675、14230.614

PerfMon 图中显示的是:

15.546, 9.930

有人可以解释一下吗?

4

1 回答 1

2

几个猜测。

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

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

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

于 2010-03-18T09:34:36.427 回答