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

问题描述 投票:0回答:8

干掉……虽然我从来没有足够的逻辑运算使它成为性能瓶颈 - 我想知道,使用按位与(&)和按位或(|)而不是同名逻辑会更好吗运算符(&& 和 ||)如果可能的话?也许这个问题可以这样开头:我不知道有一个库可以将 Java 转换为汇编来查看操作数。

java bit-manipulation
8个回答
24
投票

位运算符避免分支指令,即使在 Java 代码执行中也是如此。因此,您不会出现昂贵的分支预测失误,也不会发生任何跳转。

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

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


5
投票

无论如何,其中大部分都会被编译器优化。快速谷歌显示了这个方便的指南来查看你的Java作为汇编器。我一直认为,清晰、人类可读的代码比少几纳秒的 CPU 时间更重要。

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


5
投票

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

更新

遗憾的是,几年后该链接不再有效

更新2

幻灯片 10

Surprising Behavior

- Which is faster, conditional AND (&&) or logical (&)?
- In the old days, conditional or was faster
  - Avoided evaluating the 2nd operand if unneeded
- Now logical AND is often faster, as it is branch-free
  - Modern processors do branch prediction
  - Mispredicted branches are expensive (~100 cycles)

幻灯片链接 https://wiki.jvmlangsummit.com/images/1/1d/PerformanceAnxiety2010.pdf


4
投票

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

奇怪的是,您从询问有关性能的琐碎问题变成了询问是否应该在代码中实际执行此操作。嗯,第二个很简单。不会。作为开发人员,编写不太清晰的代码的成本将超过 CPU 成本的纳秒差异。如果您需要优化这么多,请使用 C 或 C++。


2
投票

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

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

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


1
投票

您可以尝试编写一个具有 100000 位按位运算的小程序,使用计时器函数来确定运行时间。然后对逻辑操作做同样的事情。运行几次并检查结果。


1
投票

没有。

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

最后但并非最不重要的一点是,使用逻辑运算符可以更好地表达含义。


1
投票

就像薛定谔的猫同时是和否

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

  • 与:0.9 毫
  • 无:50 毫秒

我使用的是回溯算法,所以它解释了为什么按位运算速度如此之快,因为数独是一个 NP 完全(可能是 NP 困难)问题。

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

general 中,按位运算总是比任何对应操作都快,但除非您正在做的事情是关键软件的瓶颈,否则我不会建议您出于其他原因使用它。

© www.soinside.com 2019 - 2024. All rights reserved.