为什么将某些代码模式(当存在于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; }
答案很简单:以这种方式定义内在函数,因为存在一种更快,本机的方法来获取函数结果,并且可以在指定映射的情况下使用该方法。
那根本与编译无关。Integer.bitCount在实现被标记为可替换为本地asm指令POPCNT的意义上,它是特殊的。基本上,在使用Integer.bitCount函数时(如果CPU支持该指令)使用此本机指令,当您声明函数的自己副本时,将使用常规实现。
Integer.bitCount
为什么JVM能够识别出功能可以优化?因为它是硬编码的地方在JDK中,有无关相似的代码。