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

Which is faster: a conditional or a few extra arithmetic operations?

这是那些无关紧要的小优化问题之一,但无论如何想想都很有趣。

我有两行不同的 Java 代码可以使用:

  1. coord < 0 ? (coord % max + max) % max : coord % max
  2. (coord % max + max) % max

我假设 max 始终是一个正整数,而 coord 可以是任何有效的整数。我相信这两条线应该总是产生相同的结果,即包裹一个坐标,该坐标超出了我的地图边缘,那里有怪物。

2 在坐标为负的情况下显然更快。但是如果协调是积极的,我不确定哪个会更快。 1 的要点是在坐标为正的情况下减少数学运算,但我不确定这是否真的更快。编译器甚至可能将 1 优化为 2。有人知道吗?

顺便说一下,我在网上看到有人 post 包装坐标的函数,在坐标为负的情况下只添加最大值,在坐标 > max*-1 的情况下中断。我要我处理那个案子。

(稍后编辑)The context is up on Github 给任何想看的人。是的,我知道这对我的程序的性能实际上并不重要,但我只是认为这是一个有趣的问题。

我猜答案是branch prediction

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

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

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

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

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

请注意 guava 也使用它。