性能计数器递增不正常?

问题描述:

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

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

然后当我在我的基地柜台上拨打increment()时,它会给avgcounter的原始值增加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 

我想我可能是错的使用计数器,但为什么改变了平均的rawvalue似乎也改变rawvalue的基地?我不认为这应该发生。

+0

我不明白你期望发生什么。你能否用具体的价值来澄清你的例子,以及你在每个陈述后期望的rawValue? – 2009-07-23 17:55:53

+0

好吧,我编辑了这个问题。希望现在更清楚。感谢您的意见。 – jrsconfitto 2009-07-24 13:47:26

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

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

等效于以下语句:

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

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