这是一个无关紧要的小优化问题,但无论如何都要考虑很有趣。
我有两种不同的Java代码可供使用:
coord < 0 ? (coord % max + max) % max : coord % max
或(coord % max + max) % max
我认为max总是一个正整数,而coord可以是任何有效的int。我相信这两行应该总是产生相同的结果,即包裹一个离开地图边缘的坐标,那里有怪物。
在coord为负的情况下,2显然更快。但如果coord是积极的,我不确定哪个会更快。 1的要点是在coord为正的情况下做较少的数学运算,但我不确定这实际上是否更快。编译器甚至可能优化1成为2.有人知道吗?
顺便说一下,我已经看到人们在线发布用于包裹坐标的函数,在coord为负的情况下只增加max,并且在coord&gt;的情况下中断。最大* -1。我希望我能处理这个案子。
(稍后编辑)The context is up on Github适用于任何想要观看的人。是的,我知道这对我的节目的表现并不重要,但我只是觉得这是一个有趣的问题。
答案 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),则执行的代码取决于输入数据。因此,根据输入数据,分支预测可能不起作用,因为可能无法预测哪个分支将被执行。