7

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

4

8 回答 8

24

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

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

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

于 2012-06-15T14:18:23.850 回答
6

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

于 2012-06-15T20:57:52.947 回答
5

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

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

于 2012-06-15T14:15:51.923 回答
4

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

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

于 2012-06-15T14:16:03.500 回答
2

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

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

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

于 2012-06-15T14:16:10.330 回答
2

不。

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

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

于 2012-06-15T14:18:44.247 回答
1

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

于 2012-06-15T14:18:10.293 回答
1

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

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

  • 有:0.9 毫
  • 无:50 毫秒

我使用的是回溯算法,所以它解释了为什么它使用按位运算要快得多,因为数独是一个 NP-Complete(可能是 NP-Hard)问题。

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

一般来说,按位运算总是比任何对应物都快但除非您正在做的是关键软件的瓶颈,否则我不建议无缘无故地使用它。

于 2012-06-15T14:56:33.893 回答