10

使用现有的 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;
            }
         ...

通过许多其他值。

4

2 回答 2

26

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

编辑:这在 JLS中明确提到:

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

或者,更坦率地说(来自同一部分):

伟大的 C hack,汤姆,但它在这里无效。

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

于 2010-03-16T01:25:44.143 回答
9

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

相反,您应该优化更大的图片。让 JIT 编译器处理低级优化。

于 2010-03-16T01:43:17.290 回答