Java:比等效逻辑运算符按位OR和AND更快?

时间:2012-06-15 14:13:31

标签: java bit-manipulation

切割和干燥...虽然我从来没有足够的逻辑操作来成为性能瓶颈 - 我想,我会更好地使用按位和(&)和按位或(|)而不是相同 - 如果可能,命名逻辑运算符(&&和||)?也许这个问题可以通过我不知道将Java转换为汇编来查看操作数的库来开始。

8 个答案:

答案 0 :(得分:18)

按位运算符避免分支指令,即使在Java代码执行中也是如此。因此,您没有昂贵的分支预测错误,也没有任何跳跃。

根据我的经验,当在经常执行的代码中使用时,可以显着更快。但请记住,按位运算符不是短路运算符,在某些情况下实际上可能会对性能产生负面影响。

也就是说,这种微观优化只应作为最后的手段,并且只有在分析器告诉您这样做之后才能使用 - 可读性和可维护性首先出现。

答案 1 :(得分:5)

我建议您在Parleys.com上观看Josh Bloch的“表现焦虑”演讲。 http://www.parleys.com/#st=5&id=2103&sl=1

答案 2 :(得分:4)

无论如何,大部分内容都会被编译器优化。快速Google会将this handy guide显示为将Java视为汇编程序。我一直认为清晰,易读的代码比几纳秒的CPU时间更重要。

由于JVM的额外层,Java并不是提高速度的最佳语言。如果您对这种精确优化感兴趣,您可能希望转向另一种语言,例如C / C ++。 This list显示了您可能希望查看的语言。

答案 3 :(得分:4)

  

我想,如果可能的话,我会更好地使用按位和(&)和按位或(|)而不是逻辑运算符吗?

奇怪的是,你从询问关于性能的琐事问题到询问你是否应该在你的代码中实际执行它。那么第二个很容易。不会。作为开发人员编写不太清晰代码的成本将超过CPU成本的纳秒级差异。如果你需要优化这么多,请使用C或C ++。

答案 4 :(得分:2)

Java编译器只编译为与实际机器代码相当远的字节代码。 JVM负责这样做,像HotSpot这样的现代JVM非常擅长这样做。因此,编写最简单,最清晰的代码来完成您需要做的事情。

简而言之,您很可能无法衡量任何差异。

要查看生成的实际机器代码,您需要让JVM向您显示。这取决于供应商。

答案 5 :(得分:2)

没有

首先,与逻辑运算符相比,使用按位运算符容易出错(例如,右移1不等于乘以2)。 其次,性能优势可以忽略不计(如果有的话)。

最后但同样重要的是,使用逻辑运算符可以更好地传达意义。

答案 6 :(得分:1)

您可以尝试编写一个小程序,例如100000个按位运算,使用timer函数来确定运行时。然后为逻辑操作执行相同的操作。运行它们几次并查看结果。

答案 7 :(得分:1)

喜欢schrodinger的猫是和否同时。

这取决于你真正做的事情!我曾经做过一个带有和没有按位操作的数独求解器。这是我的基准:

  • 使用:0.9毫升
  • 没有:50毫升

我正在使用回溯算法,所以它解释了为什么它按位运算速度快得多,因为sodoku是NP-Complete(可能是NP-Hard)问题。

但是,就像其他已经告诉过你的那样,它很难阅读和维护(我永远不会回到我的数独求解器中进行任何更改,我不会在某个地方理解我做了什么)。

general 中,按位操作总是比任何对手快,但除非您正在做的是关键软件的瓶颈,否则我不建议使用它除了那个之外没有任何理由。