重置计数器或让它增加并使用模数更有效

时间:2013-02-22 15:49:10

标签: java c++ performance coding-style

假设您需要跟踪调用方法的次数,并在调用n次时打印一些内容。什么是最有效的:

  1. 使用long变量_counter并在每次调用方法时增加它。每次调用都会测试相等的“_counter%n == 0”

  2. 使用int变量_counter并在每次调用方法时增加它。当_counter = n时,打印消息并将变量_counter重置为0.

  3. 有人会说这种差异可以忽略不计,你可能是对的。我只是好奇最常用的方法

6 个答案:

答案 0 :(得分:7)

在这种特殊情况下,既然你需要一个if语句ANYWAY,我会说你应该在达到计数时将它设置为零。

但是,对于每次都使用该值的情况,并且只想在“达到某个值时将其回绕到零”,则情况不太明显。

如果您可以将n调整为2的幂(2,4,8,16,32 ......),那么您可以使用counter % n的技巧与{相同} {1}} - 这使得操作非常快。

如果counter & (n-1)不是2的幂,那么很可能你最终做了一个真正的鸿沟,这是一个坏主意 - 与常规指令相比,鸿沟非常昂贵,并且比较和重置是很可能比分裂选项更快。

当然,正如其他人所提到的,如果您的计数器达到了该类型的最大限制,您最终可能会获得各种有趣的游戏。

编辑:当然,如果你正在打印某些东西,那可能比划分长一倍,所以它实际上是微优化,除非n非常大。

答案 1 :(得分:1)

这取决于n的值...但我打赌重置并且简单的相等检查更快。 此外,重置计数器更安全,您永远不会达到您的号码的代表限制。 编辑:还考虑可读性,进行微观优化可能会使代码模糊不清。

答案 2 :(得分:1)

为什么不两者兼顾。

如果它成为一个问题,那么看看是否值得优化 但是在问题出现之前甚至没有意义(在你的算法中会出现更大的问题)。

count = (count+1) % countMax;

答案 3 :(得分:0)

我认为由于以下原因重置计数器总是更好:

  1. 对于不熟悉的程序员(例如,维护程序员),代码更清晰。
  2. 重置计数器时,算术(可能是拼写错误)溢出的可能性较小。

答案 4 :(得分:0)

答案 5 :(得分:0)

以下是100000000次迭代的执行时间,单位为ms

modTime = 1258

counterTime = 449

po2Time = 108

正如我们所看到的,2的幂远远超过其他方法,但它仅用于2的幂,我们的普通计数器也比模数快2.5倍。那么我们为什么要使用模数增量呢?在我看来,我认为它们提供了一个干净的代码,如果使用得当,它们是了解

的好工具

original post