JVM 何时会使用内联函数

2022-09-02 03:17:03

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

答案 1

答案很简单:以这种方式定义内在函数,因为存在一种更快的本机方法来获取函数的结果,并且由于指定的映射而应用了它。

这与编译完全无关。 它的特殊之处在于,实现被标记为可替换为本机 asm 指令 POPCNT。基本上,在使用函数时(如果CPU支持该指令)使用此本机指令,当您声明自己的函数副本时,将使用正常的实现。Integer.bitCountInteger.bitCount

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


答案 2

JVM 有一个方法列表,通常是本机方法,它被内联的机器代码所取代。此列表出现在OpenJDK的固有头文件中,尽管我在Web上找不到指向它的链接。

请参阅链接中的第 581 行@Jack提供的 vmSymbols.hpp


推荐