4

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

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

然后,当我调用increment()我的基本计数器时,它会将 1 加到 avgcounter 的原始值,并增加基本计数器……增加对伤害的侮辱!

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

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

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 为 7+value,AvgCounterBase 为 7+value   
 AvgCounterBase.Increment() 'AvgCounter.RV 为 7+value+1,AvgCounterBase 为 7+value+1  

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

4

1 回答 1

0

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

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

等价于这些语句:

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

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

于 2009-07-23T17:13:26.513 回答