【发布时间】:2009-10-03 21:54:46
【问题描述】:
Eclipse 编译器会自动将乘以 2 的幂转换为位移,还是应该手动进行?感谢您的帮助。
【问题讨论】:
标签: java eclipse optimization compiler-construction
Eclipse 编译器会自动将乘以 2 的幂转换为位移,还是应该手动进行?感谢您的帮助。
【问题讨论】:
标签: java eclipse optimization compiler-construction
简短回答:不。源代码编译器不会用位移替换乘以 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 型号而异。
如果您有兴趣了解 VM 实际在做什么,获取 jdk7 的调试版本并启用 Hotspot 编译器生成的汇编代码转储是非常有益的。
【讨论】:
除非您确切地知道自己在做什么,否则不要再猜测现代 Java 编译器。 这不仅适用于像您提出的问题这样的简单数学问题,而且适用于所有事情。例如:如流控制。
比我们聪明的人已经付出了很多努力来让这一切变得超级快。
【讨论】:
一般来说,你无法超越 JVM,除非有一些非常高级的东西你知道不能自动推断。这通常意味着可以使用比当前使用的算法更好的算法,而不必手动调整您的源。您可以使用最新 Java 6 JDK 中提供的 jvisualvm 分析器来调查您的程序并查看瓶颈所在。
例如,与过去 10 年相比,创建新对象而不是重用旧对象的成本已大幅减少,因此您不应该在不检查是否仍然有效的情况下接受任何旧的建议来调整您的 java 程序。
但是,您会发现,让您的程序保持简单且最重要的是 - 可读性 - 将使您和未来的程序员更容易维护。任何不必要的复杂性都会让您未来的读者感到困惑,您需要在评论中说明为什么它必须是这样的(否则他们只会将其重构回原来的形式:)
【讨论】: