【问题标题】:Does Duff's Device Speed up Java Code?Duff 的设备会加速 Java 代码吗?
【发布时间】:2011-01-27 22:27:32
【问题描述】:

使用现有的 Sun 1.6 编译器和 JRE/JIT,使用 Duff 的设备示例的那种扩展展开来展开循环是否是个好主意?还是最终导致代码混淆而没有性能优势?

我使用的 Java 分析工具在逐行 CPU 使用方面的信息不如 valgrind,因此我希望通过其他人的经验来增强测量。

请注意,当然,您不能准确地对 Duff 的设备进行编码,但您可以进行基本的展开,这正是我想知道的。

        short stateType = data.getShort(ptr);
        switch (stateType) {

        case SEARCH_TYPE_DISPATCH + 16:
            if (c > data.getChar(ptr + (3 << 16) - 4)) {
                ptr += 3 << 16;
            }
        case SEARCH_TYPE_DISPATCH + 15:
            if (c > data.getChar(ptr + (3 << 15) - 4)) {
                ptr += 3 << 15;
            }
         ...

向下遍历许多其他值。

【问题讨论】:

  • 我不明白你修改后的问题。达夫的装置并不意味着只是失败。交错循环是关键部分。
  • 你为什么不……测试一下?像往常一样写一个带有循环的版本。用展开的循环编写一个版本。编写一个框架,每个框架执行一百万次(或其他)。看看您的优化尝试带来了哪些性能提升(如果有)。

标签: java duffs-device


【解决方案1】:

它是否是一个好主意并不重要(它不是),因为它不会编译。

编辑:这是明确提到的in the JLS

可以在 C 或 C++ 中使用称为 Duff 设备的技巧来展开循环,但这不是 Java 编程语言中的有效代码:

或者,更直接地说(来自同一部分):

伟大的 C hack,Tom,但在这里无效。

编辑:要回答您更(太)一般的问题,通常不会。您通常应该依赖 JIT。

【讨论】:

【解决方案2】:

您忽略了 Java 编译为面向堆栈的虚拟机的字节码这一事实。无论您在 Java 级别尝试什么低级优化技巧,基本上都是无效的。真正的优化发生在 JIT 编译器为目标体系结构生成程序集时,这个过程在大多数情况下您既无法控制也无法关心。

您应该在更大的图片上进行优化。让 JIT 编译器处理低级优化。

【讨论】:

  • 我没有忽略它,我在问你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多