小编典典

JVM什么时候使用内在函数

java

为什么将某些代码模式(当存在于JVM内部类中时)转换为内在函数,而将相同的模式从我自己的类中调用时却不是。

例:

从Integer中调用bitCount函数时,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;
}

阅读 211

收藏
2020-09-11

共1个答案

小编典典

答案很简单:以这种方式定义内在函数,因为存在一种更快,本机的方法来获取函数结果,并且可以在指定映射的情况下使用该方法。

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

为什么JVM能够识别出功能可以优化?因为它是硬编码的地方在JDK中,有无关相似的代码。

2020-09-11