Duff的设备能加速Java代码吗?

时间:2010-03-16 01:11:38

标签: java duffs-device

使用库存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;
            }
         ...

通过许多其他价值观。

2 个答案:

答案 0 :(得分:24)

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

编辑:明确提到in the JLS

  

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

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

  

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

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

答案 1 :(得分:9)

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

您应该在更大的范围内进行优化。让JIT编译器处理低级优化。