为什么出现在JVM内部类中的某些代码模式被转换为一个内部函数,而从我自己的类中调用的相同模式却不是。
示例:
bitCount函数,当从Integer.bitCount(i)内部调用时,将被转换为内部函数。但是,当复制到我的类,然后调用将需要更长的时间来执行。
比较
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;
}发布于 2013-11-10 16:55:58
答案很简单:通过这种方式定义了一个内在函数,因为存在一种获得函数结果的更快、更本地的方法,并且在特定映射的情况下应用它。
这和编译一点关系都没有。Integer.bitCount是特殊的,因为使用本机asm指令POPCNT将实现标记为可替换。基本上,本机指令在使用Integer.bitCount函数时使用(如果CPU支持该指令),当您声明自己的函数副本时,将使用正常的实现。
为什么JVM能够识别函数可以被优化呢?因为它是JDK中硬编码的某处,这与代码的相似性无关。
发布于 2013-11-10 16:57:56
JVM有一个方法列表,通常是本机方法,这些方法被内联的机器代码替换。这个列表出现在OpenJDK的内部头文件中,尽管我在web上找不到到它的链接。
参见链接@Jack提供的vmSymbols.hpp中的第581行
https://stackoverflow.com/questions/19892322
复制相似问题