增加/减少与分配?

时间:2009-04-16 19:29:11

标签: c++ statistics

我在我的应用程序中记录了一些统计信息。其中一个统计数据是BigDataStructure的大小。我有两个选择:

  1. 创建一个计数器并增加/ 每次递减计数器 有一个添加/删除 BigDataStructure。

  2. 每次添加/删除 从BigDataStructure,设置 与BigDataStructure.size()的对应。

  3. 以某种方式做这件事是否有充分的理由?递增/递减计数器本身可以避免调用BigDataStructure.size()。它也不直接涉及赋值运算符(虽然它可能在引擎盖下?)

    鉴于这两个选项,哪一个更可取?

9 个答案:

答案 0 :(得分:9)

.size()可能是2个选项中不易出错的原因,因为它是idempotent。如果你想进入线程/同步问题,.size()在这里更安全。

此外,今天你只有一个地方可以添加条目,还有一个地方可以删除条目。但也许将来情况并非如此。

答案 1 :(得分:4)

这取决于......

如果BigDataStructure.size()需要工作来计算大小,我会使用一个计数器。在这种情况下,这会更有效。

如果BigDataStructure.size()是可以由BigDataStructure自动确定的东西,那么需要很少的计算,我更喜欢这种方法。它具有将逻辑保持在一个地方的优点,因此在这方面看起来更清洁/更多OO。

答案 2 :(得分:3)

充分利用这两个世界并同时做到这两点。如果您的号码不同意,您可能会发现奇怪的事情发生。这是断言的好候选人。

答案 3 :(得分:1)

增量/减量可能更快,因为它避免了函数调用,但可能存在记录大小与实际大小不同步的风险。如果你有信心他们不会,那么我会说只是使用递增/递减。

答案 4 :(得分:1)

我选择选项1.

AFAIK,x ++和x + = 1在各方面都与x = x + 1相同(除了你输入的内容)

答案 5 :(得分:1)

如果从多个线程进行添加和删除,则递增和递减需要额外的注意。另一方面,如果可以快速计算大小,那么这与正确值不同步的风险很小。

答案 6 :(得分:1)

为什么不将计数器保留在BigDataStructure的内部,然后只要在这些函数中添加或删除,就可以递增或递减。当你调用size()时,你只需返回内部计数器的值。

答案 7 :(得分:0)

如果性能受到关注,则取决于对size()的调用的成本。例如,对STL列表的size()调用可以是O(n)。即使调用是O(1),增加和减少外部计数器也可能更快。您可能需要进行一些性能测量,以找出哪个更有效。如果不考虑性能,那么请调用size()。

答案 8 :(得分:0)

我会使用第一个,然后使用assert(counter == BigDataStructure.size());