2009-07-23 65 views
3

可能是一個菜鳥錯誤,但我得到了一些奇怪的東西。我試圖編織一個.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

回答

1

這種行爲是應該如何工作的。 Increment和IncrementBy實質上是線程安全版本,可以通過直接修改RawValue來完成。當計數器只由一個線程訪問這些語句:

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

等效於以下語句:

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

如果被多個線程訪問,修改RawValue直接不是線程安全的,都不可能丟失一些更新。