性能计数器递增不正确?

时间:2009-07-23 17:00:31

标签: .net vb.net performance counter

可能是一个菜鸟错误,但我得到了一些奇怪的东西。我正在尝试将.NET性能计数器编织到应用程序中。

当我在我的avg性能计数器上调用incrementBy(value)方法时,它也会按值更改基本计数器的RawValue。我检查了变量名称并认为一切都是正确的。

然后当我在我的基础计数器上调用increment()时,它会向平均值的原始值增加1并增加基础计数器......加重侮辱伤害!

还有其他人见过这种行为吗?对于发生了什么以及如何解决它的任何建议?

在代码中,我使用两个不同的计数器来测量我编写的合并排序的时间。我有一个关于排序时间和平均计数器的瞬时计数器。

Dim timePiece As New Stopwatch()

timePiece.Start()
MergeSort()
timePiece.Stop()

ElapsedCounter.RawValue = timePiece.ElapsedMilliseconds
AvgCounter.IncrementBy(timePiece.ElapsedMilliseconds)
AvgCounterBase.Increment()

我所看到的是:

'Elapsed counter works as expected  
'AvgCounter RawValue is 7, AvgCounterBase RawValue is also 7 before incrementing
 AvgCounter.IncrementBy(value) 'AvgCounter.RV is 7+value, AvgCounterBase is 7+value   
 AvgCounterBase.Increment()    'AvgCounter.RV is 7+value+1, AvgCounterBase is 7+value+1  

我认为我可能会使用错误的计数器,但为什么更改平均值的原始值似乎也会改变基数的原始值?我不认为这应该发生。

1 个答案:

答案 0 :(得分:0)

这种行为是它应该如何运作的。 Increment和IncrementBy本质上是线程安全的版本,您可以通过直接修改RawValue来自己完成。当计数器仅由单个线程访问时,这些语句:

counterVariable.RawValue++;
counterVariable.RawValue += 2;

等同于这些陈述:

counterVariable.Increment();
counterVariable.IncrementBy(2);

如果多个线程访问,直接修改RawValue不是线程安全的,可能会丢失一些更新。