【问题标题】:Quick Java Optimization Question快速Java优化问题
【发布时间】:2009-10-03 21:54:46
【问题描述】:

Eclipse 编译器会自动将乘以 2 的幂转换为位移,还是应该手动进行?感谢您的帮助。

【问题讨论】:

    标签: java eclipse optimization compiler-construction


    【解决方案1】:

    简短回答:不。源代码编译器不会用位移替换乘以 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 编译器生成的汇编代码转储是非常有益的。

    【讨论】:

      【解决方案2】:

      除非您确切地知道自己在做什么,否则不要再猜测现代 Java 编译器。 这不仅适用于像您提出的问题这样的简单数学问题,而且适用于所有事情。例如:如流控制。

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

      【讨论】:

      • 怎么问==第二次猜测?
      • @HRJ 当它成为过早优化的问题时
      • 我不明白您如何推断这是“过早优化”的情况。此外,这个问题不仅与 OP 的案例有关,而且与 StackOverflow 的访问者可能遇到的许多其他案例有关。
      • @HJR:我阅读了原始问题,并做出了相应的回答。因此,为什么 OP 选择我的答案是正确的——他试图优化,这个问题不仅仅是学术问题。其他访问者可以阅读 jarnbjo 的答案并投票(就像我一样)。我的回答绝不会减损这一点。这两个答案对未来的访问者都很有价值。 StackOverflow 不需要有一个真正的答案来统治他们。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-26
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-20
        • 2020-06-18
        相关资源
        最近更新 更多