Eclipse Java 编译器会优化 2 的幂乘法吗?

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

Eclipse 编译器会自动将 2 的幂乘法转换为位移位,还是应该手动转换?

java eclipse optimization
3个回答
37
投票

简短回答:不会。源代码编译器不会用位移位来替换乘以 2。

长答案:不会,因为它无法知道在代码最终运行的平台上位移是否比乘法更快。因此,问题应该是特定的虚拟机是否会用位移位代替乘法,而且很可能会。我对此进行了一些实验来优化代码块,有趣的是,Sun 的 Hotspot 在这里显示了不同的行为,具体取决于程序是在 AMD 还是在 Intel CPU 上运行(至少在我测试的 CPU 上)。在任何一种情况下,2 的幂乘法都将替换为位移位,但对于 2 的幂 +/- 1(3、5、7、9、15、17...)的乘法,Hotspot 将对于 Intel CPU 生成位移和加法或减法,而对于 AMD CPU 生成乘法,因为 AMD CPU 执行乘法的速度比 Intel CPU 快得多。当然,每个供应商的不同 CPU 型号之间的这种行为可能有所不同。

如果您有兴趣了解虚拟机实际在做什么,那么获得 jdk7 的调试版本并启用 Hotspot 编译器生成的汇编代码的转储是非常有帮助的。


9
投票

不要再猜测现代的java编译器,除非你确切地知道你在做什么。这不仅适用于像你问题这样的简单数学,而且适用于一切。 例如:像流量控制。

比我们聪明的人们付出了很多努力,让这一切变得超级快。


4
投票

一般来说,你无法智胜 JVM,除非有一些非常高级的东西知道无法自动推论。 这通常意味着可以使用比当前使用的算法更好的算法,而不必手动调整源代码。 您可以使用最新 Java 6 JDK 中提供的 jvisualvm 分析器来调查您的程序并查看瓶颈所在。

例如,创建新对象而不是重用旧对象的成本在过去 10 年里已经大幅减少,因此您不应该在不检查它是否仍然有效的情况下采纳任何旧的建议来调整您的 java 程序。

但是,您会发现保持程序简单并且最重要的是可读性将使您和未来的程序员更容易维护。 任何不必要的复杂性都会让你未来的读者感到困惑,你需要在评论中说明为什么它必须是这样的(否则他们只会将其重构回原来的形式:)

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