21

为什么在 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;
}
4

2 回答 2

31

答案很简单:以这种方式定义内部函数是因为存在获得函数结果的更快、本地的方法,并且由于指定的映射而应用它以防万一。

这根本与编译无关。在实现被标记为可以用本机 asm 指令POPCNTInteger.bitCount替换的意义上是特殊的。基本上,在使用该函数时(如果 CPU 支持该指令)会使用此本机指令,当您声明自己的函数副本时,将使用正常实现。Integer.bitCount

为什么JVM能够识别出可以优化的功能?因为它在 JDK 的某个地方被硬编码,所以与代码的相似性无关。

于 2013-11-10T16:55:58.157 回答
7

JVM 有一个方法列表,通常是本地方法,用内联机器代码替换。此列表出现在 OpenJDK 的内部头文件中,尽管我在网络上找不到指向它的链接。

See from line 581 in the link @Jack provided vmSymbols.hpp

于 2013-11-10T16:57:56.793 回答