为什么某些代码模式在 JVM 内部类中出现时会变成内部函数,而从我自己的类中调用时却不会。
例子:
bitCount 函数,当从 Integer.bitCount(i) 内部调用时,将转换为内在函数。但是当复制到我的类中然后调用时,执行时间会更长。
Compare
Integer.bitCount(i)
MyClass.bitCount(i)
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
答案很简单:以这种方式定义内在函数是因为存在一种更快、本机的方式来获取函数的结果,并且由于指定的映射而可以应用它。
这根本与编译无关。Integer.bitCount
是特殊的,因为实现被标记为可以用本机 asm 指令替换POPCNT。基本上这个本机指令是在使用时使用的Integer.bitCount
函数(如果 CPU 支持该指令),当您声明自己的函数副本时,将使用正常的实现。
为什么JVM能够识别出可以优化的函数?因为它是硬编码的某处在 JDK 中,这与代码的相似性无关。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)