哪个更快:有条件或一些额外的算术运算?

时间:2016-12-06 16:42:26

标签: java optimization coordinates wrapping

这是一个无关紧要的小优化问题,但无论如何都要考虑很有趣。

我有两种不同的Java代码可供使用:

  1. coord < 0 ? (coord % max + max) % max : coord % max
  2. (coord % max + max) % max
  3. 我认为max总是一个正整数,而coord可以是任何有效的int。我相信这两行应该总是产生相同的结果,即包裹一个离开地图边缘的坐标,那里有怪物。

    在coord为负的情况下,

    2显然更快。但如果coord是积极的,我不确定哪个会更快。 1的要点是在coord为正的情况下做较少的数学运算,但我不确定这实际上是否更快。编译器甚至可能优化1成为2.有人知道吗?

    顺便说一下,我已经看到人们在线发布用于包裹坐标的函数,在coord为负的情况下只增加max,并且在coord&gt;的情况下中断。最大* -1。我希望我能处理这个案子。

    (稍后编辑)The context is up on Github适用于任何想要观看的人。是的,我知道这对我的节目的表现并不重要,但我只是觉得这是一个有趣的问题。

2 个答案:

答案 0 :(得分:1)

您使用过于复杂的表达式来表示否定案例:

coord < 0 ? (coord % max + max) % max : coord % max

相同
coord < 0 ? coord % max + max : coord % max

错误预测的分支可能代价高昂,但在现代i86 / amd64上,可以使用条件移动来消除分支。所以情况很可能更快。

请注意guava也使用它。

答案 1 :(得分:0)

我猜答案是branch prediction

如果使用分支(if-else),则执行的代码取决于输入数据。因此,根据输入数据,分支预测可能不起作用,因为可能无法预测哪个分支将被执行。