32

可能的重复:
移位比Java中的乘法和除法更快吗?。网?
快速Java优化问题

很多年前在大学里,我了解到右移一位与除以二的效果相同,但通常要快得多。我不确定自 9 到 10 年前我了解到 Java 在这方面是如何发展的。Java编译器会自动将除以二转换为移位操作,还是我应该自己在代码中手动执行移位操作?

4

4 回答 4

68

除非您在商店和代码库中工作,否则移位很常见,恕我直言,您冒着混淆的风险。是的,这些表达式在逻辑上可能是等价的,但是:

  • n00b 可能会被替代语法弄糊涂
  • 像我这样从大学开始就不需要做任何移位的老人可能会感到困惑
  • 如果你有点转变并觉得有必要评论你刚刚所做的事情,那么你肯定会离开。简单的除法是自我记录的,任何熟悉初等数学的人都会清楚
  • 您不会在简单的事情上超越编译器进行优化,所以不要费心尝试
  • 作为良好的编码实践,最好使您的代码简单/香草而不是聪明(呃)

所有这些都是相对的,同样,真的取决于您商店的标准。如果您的同事喜欢位移,那么请务必继续进行位移。

于 2010-11-01T20:17:49.257 回答
22

是的,这是任何试图进行编译器优化的人都会做的第一件事(并且已经做了至少 5 年),它肯定是由 Java JIT 编译器完成的,你可能很难找到任何不这样做的编译器。

即使他们不这样做,它仍然是一个过早的微优化,应该避免有利于让代码更清晰。

于 2010-11-01T20:20:25.447 回答
19

现代编译器足够聪明,可以生成最快的除以二的代码。如果速度更快,他们会换班。如果你想要实现的是除以 2,那么使用除法会让你的代码更清晰。当被除数为负数时,您将避免出现问题。

于 2010-11-01T20:19:26.993 回答
10

您的 CPU 的除法例程将处理此问题。你没有必要这样做。

这称为过早优化

于 2010-11-01T20:17:53.073 回答