我在我的应用程序中记录了一些统计信息。其中一个统计数据是BigDataStructure的大小。我有两个选择:
创建一个计数器并增加/ 每次递减计数器 有一个添加/删除 BigDataStructure。
每次添加/删除 从BigDataStructure,设置 与BigDataStructure.size()的对应。
以某种方式做这件事是否有充分的理由?递增/递减计数器本身可以避免调用BigDataStructure.size()。它也不直接涉及赋值运算符(虽然它可能在引擎盖下?)
鉴于这两个选项,哪一个更可取?
答案 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());