2009-04-16 159 views
1

我在應用程序中記錄了一些統計信息。其中一個統計數據是BigDataStructure的大小。我有兩個選擇:遞增/遞減與分配?

  1. 創建一個計數器和遞增/遞減 計數器每次 有一個附加從 BigDataStructure /刪除。

  2. 每次從BigDataStructure中添加/刪除 時,請將 計數器設置爲BigDataStructure.size()。

是否有這樣或那樣的一個好的理由?自己遞增/遞減計數器避免了對BigDataStructure.size()的調用。它也不直接涉及賦值操作符(雖然也許它在引擎蓋下?)

給定這兩個選項,哪一個更好?

回答

9

.size()可能會減少2個選項的錯誤傾向,因爲它是idempotent。如果你想進入線程/同步問題,.size()在這裏更安全。

另外,今天你只有1個地方添加條目,1個地方刪除條目。但也許在未來情況並非如此。

+0

+1,一天的好詞;) – JaredPar 2009-04-16 20:06:21

+0

+1如果你告訴我怎樣讀「冪等」 :) :) – 2009-04-17 02:36:45

1

遞增/遞減的速度可能會更快,因爲它避免了函數調用,但可能存在記錄大小與實際大小不同步的風險。如果你確信自己不會這麼做,那麼我會說只是使用遞增/遞減。

4

這取決於...

如果BigDataStructure.size()需要工作來計算規模,我會用一個計數器。在這種情況下這將更有效率。

如果BigDataStructure.size()是可以由BigDataStructure自動確定的事情,那麼需要很少的計算,我寧願這種方法。它具有將邏輯保存在一個地方的優點,所以在這方面它看起來更清潔/更多OO。

1

我會去與選項1

據我所知,X ++以及x + = 1在各方面都相同,X = X + 1(比你鍵入的內容等)

3

獲取最好的兩個世界,並做他們倆。如果你的數字不一致,你可能會發現奇怪的事情。這是斷言的一個很好的候選人。

1

如果添加和刪除操作是從多個線程完成的,則遞增和遞減操作需要額外注意。另一方面,如果可以快速計算大小,那麼這與正確的值不會同步。

0

如果性能令人擔憂,它取決於調用size()的成本是多少。例如,對STL列表的size()調用可以是O(n)。即使調用是O(1),增加和減少外部計數器可能會更快。你可能必須做一些性能測量來找出哪一個更有效。如果性能不是問題,那麼請去調用size()。

1

你爲什麼不保持內部BigDataStructure計數器,然後當你做一個添加或刪除這些功能在裏面可以遞增或遞減。當你調用size()時,你可以返回內部計數器的值。

0

我會用第一,然後assert(counter == BigDataStructure.size());