性能计数器递增不正常?
问题描述:
可能是一个菜鸟错误,但我得到了一些奇怪的东西。我试图编织一个.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的基地?我不认为这应该发生。
答
这种行为是应该如何工作的。 Increment和IncrementBy实质上是线程安全版本,可以通过直接修改RawValue来完成。当计数器只由一个线程访问这些语句:
counterVariable.RawValue++;
counterVariable.RawValue += 2;
等效于以下语句:
counterVariable.Increment();
counterVariable.IncrementBy(2);
如果被多个线程访问,修改RawValue直接不是线程安全的,都不可能丢失一些更新。
我不明白你期望发生什么。你能否用具体的价值来澄清你的例子,以及你在每个陈述后期望的rawValue? – 2009-07-23 17:55:53
好吧,我编辑了这个问题。希望现在更清楚。感谢您的意见。 – jrsconfitto 2009-07-24 13:47:26