为什么java中的lib-func运行得比定制的快?

为什么java中的lib-func运行得比定制的快?,java,Java,最近我对Integer.bitCount做了一些调查。 我发现了一个有趣的结果,Integer.bitCount比我自己的func快得多,即使代码是一样的 我原以为是因为JIT,但我检查了文档,发现JIT是基于运行时策略的。这把我弄糊涂了 public static void main(String[] args) { long sum = 0; long start, end; start = System.currentTimeMillis(); for (i

最近我对Integer.bitCount做了一些调查。 我发现了一个有趣的结果,Integer.bitCount比我自己的func快得多,即使代码是一样的

我原以为是因为JIT,但我检查了文档,发现JIT是基于运行时策略的。这把我弄糊涂了

public static void main(String[] args) {
    long sum = 0;
    long start, end;
    start = System.currentTimeMillis();
    for (int i = Integer.MIN_VALUE; i != Integer.MAX_VALUE; i++) {
        sum += bitCount(i);
        //sum += Integer.bitCount(i);
    }
    end = System.currentTimeMillis();
    System.out.println(sum);
    System.out.println(end - start);
}

private static int bitCount(int i) {
    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;
}
//对于位计数结果

68719476736
8715
68719476736
1892
//对于Integer.bitCount结果

68719476736
8715
68719476736
1892
但忽略这一点,一个原因是
Integer#bitCount
被标记为
@hospotintrisccandidate
。这意味着HotSpot JVM可以用汇编代码替换方法体以提高性能。从注释的:

@hospotintrisccandidate
注释特定于热点虚拟机。它表示带注释的方法可能(但不保证)由HotSpot VM内部化。如果HotSpot VM使用手工编写的汇编和/或手工编写的编译器IR(编译器的内部特性)替换带注释的方法以提高性能,则方法是内部化的。
@hospotintrinsicandidate
注释是Java库的内部注释,因此不应该与应用程序代码有任何关联


再次尝试运行您的测试;您应该会看到明显的减速。

非常感谢。我试过了。它确实表明主要原因是内在的。但我在源代码中没有发现@HotspotInTrensicAndidate注释。在中仅找到func列表