Eclipse编译器会自动将乘法乘以2的幂转换为位移,还是应该手动执行?谢谢你的帮助。
答案 0 :(得分:33)
简短回答:不会。源代码编译器不会通过位移替换乘法2。
长答案:它不会,因为它无法知道位移是否比平台上的乘法更快,代码最终将运行。所以,问题应该是,如果一个特定的VM将用一个位移替换乘法,它可能会。我对此进行了一些实验以优化代码块,并且有趣的是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编译器生成的汇编代码转储是非常有益的。
答案 1 :(得分:10)
除非你确切知道自己在做什么,否则不要再猜测现代java编译器。这不仅适用于像你一样的简单数学,而且适用于所有问题。例如:像流量控制一样。
人们比我们更聪明地投入了大量的精力让它变得非常快。
答案 2 :(得分:4)
一般情况下,除非有你知道无法自动推断的高级别,否则你不能超越JVM。这通常意味着可以获得比当前使用的算法更好的算法,而不是必须手工处理您的源。您可以使用最新Java 6 JDK中提供的jvisualvm分析器来调查您的程序并查看瓶颈所在。
例如,创建新对象而不是重用旧对象的费用已经大大减少了10年,所以你不应该采用任何旧的建议来调整你的java程序而不检查它是否仍然存在。
但是,您会发现保持程序简单且最重要 - 可读 - 将使您和将来的程序员更容易维护。任何不必要的复杂性都会让你未来的读者感到困惑,你需要在评论中说出为什么它必须如此(否则他们只会将它重构为原始形式:)。