使用库存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;
}
...
通过许多其他价值观。
答案 0 :(得分:24)
它是否是一个好主意(它不是)并不重要,因为它不会编译。
编辑:明确提到in the JLS:
可以在C或C ++中使用称为Duff设备的技巧来展开循环,但这不是Java编程语言中的有效代码:
或者,更直接地(来自同一部分):
伟大的C黑客,汤姆,但它在这里无效。
编辑:要回答更多(太)一般性问题,通常不会。您通常应该依赖JIT。
答案 1 :(得分:9)
您忽略了Java为面向堆栈的虚拟机编译为字节码的事实。无论您在Java级别尝试什么样的低级优化技巧,都基本上无效。当JIT编译器为目标体系结构生成程序集时,就会发生真正的优化,这个程序在大多数情况下既无法控制也无法关注。
您应该在更大的范围内进行优化。让JIT编译器处理低级优化。