假设您需要跟踪调用方法的次数,并在调用n次时打印一些内容。什么是最有效的:
使用long变量_counter并在每次调用方法时增加它。每次调用都会测试相等的“_counter%n == 0”
使用int变量_counter并在每次调用方法时增加它。当_counter = n时,打印消息并将变量_counter重置为0.
有人会说这种差异可以忽略不计,你可能是对的。我只是好奇最常用的方法
答案 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)
我认为由于以下原因重置计数器总是更好:
答案 4 :(得分:0)
检查Guava's RateLimiter会让您了解类似的实用程序实现http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/RateLimiter.html
答案 5 :(得分:0)
以下是100000000次迭代的执行时间,单位为ms
modTime = 1258
counterTime = 449
po2Time = 108
正如我们所看到的,2的幂远远超过其他方法,但它仅用于2的幂,我们的普通计数器也比模数快2.5倍。那么我们为什么要使用模数增量呢?在我看来,我认为它们提供了一个干净的代码,如果使用得当,它们是了解
的好工具