Duff的设备是否可以加速Java代码?

11

使用标准的Sun 1.6编译器和JRE/JIT,采用类似Duff's Device这样的大规模展开循环的方式是否是一个好主意?还是说这会成为代码混淆而没有性能提升?

我使用过的Java性能分析工具对于逐行CPU使用率的信息比如valgrind等工具要少得多,因此我想通过其他人的经验来补充测量。

当然,你不能完全复制Duff's Device的代码,但你可以进行基本的展开,这就是我想知道的。

        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
我不理解你修改后的问题。Duff's设备并不仅意味着穿透执行。交错循环是其中的关键部分。 - Matthew Flaschen
5
为什么不试一下呢?写一个通常的循环版本,再写一个展开循环版本。编写一个框架,执行每个版本一百万次(或其他次数)。看看你的优化尝试是否带来了性能提升。 - JUST MY correct OPINION
2个回答

27

无论它是否是一个好主意(它不是),都无关紧要,因为它不会编译。

编辑:在JLS中明确提到了这一点:

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

更明显地说(来自同一部分):

很棒的C hack,汤姆,但在这里无效。

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


抱歉,我的问题不够具体。 - bmargulies
我知道现在已经过去了10年。但是我们确定'Tom'指的是https://en.wikipedia.org/wiki/Tom_Duff吗? - Persixty

8
你忽略了Java编译成基于栈的虚拟机字节码这个事实。无论你在Java层面尝试什么低级别的优化技巧,都很大程度上是无效的。真正的优化发生在JIT编译器为目标架构生成汇编代码时,这是你大部分时间既无法控制也无需关心的过程。
相反,你应该从更宏观的角度进行优化。让JIT编译器处理低级别的优化即可。

10
我没有忽略它,我正在询问你有关它的事情。 - bmargulies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接