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

剪切和干燥…虽然我从来没有足够的逻辑操作来成为性能瓶颈 – 我想,我会更好地使用按位和(&)和按位或(|)而不是同名的逻辑运算符(&&和||)如果可能的话? 也许这个问题可以通过以下事实来开头:我不知道将Java转换为程序集以查看操作数。

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

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

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

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

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

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

无论如何,大部分内容都会被编译器优化。 一个快速的谷歌显示了这个方便的指南 ,将您的Java视为汇编程序。 我一直认为清晰,易读的代码比几毫秒的CPU时间更重要。

由于JVM的额外层,Java并不是提高速度的最佳语言。 如果您对这种精确优化感兴趣,可能需要转向另一种语言,如C / C ++。 此列表显示您可能想要查看的语言。

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

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

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

没有。

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

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

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

就像薛定谔的猫一样是和否

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

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

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

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

一般来说 ,按位操作总是比任何对应操作都快,但除非您正在做的是关键软件的瓶颈,否则我建议不要使用它而不是那个。