当前位置: 首页 > 知识库问答 >
问题:

为什么java中的lib函数运行得比定制的快?[副本]

卞嘉许
2023-03-14
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;
}

//对于bitCount结果

68719476736
8715

//对于Integer.BitCount结果

68719476736
1892

共有1个答案

宗政永望
2023-03-14

你的基准不准确。但忽略这一点,一个原因是因为integer#bitcount被标记为@HotSpotIntrinsicCandidate。这意味着HotSpot JVM可以用汇编代码替换方法体来提高性能。注释的源代码:

@HotSpotIntrinsicCandidate批注特定于HotSpot虚拟机。它表明一个带注释的方法可能是(但不保证是)由热点VM内含的。如果HotSpot VM用手写程序集和/或手写编译器IR--一个内在的编译器--替换带注释的方法以提高性能,那么方法就是内在的。@HotSpotIntrinsicCandidate注释是Java库的内部注释,因此不应该与应用程序代码有任何相关性。

尝试禁用intrinsics并再次运行测试;你应该会看到一个显著的放缓。

 类似资料:
  • (sharth的评论已经回答了这个问题。) 我已经用python编写了一个二进制搜索算法,它或多或少遵循与在bisect模块中找到的bisect_left函数相同的结构。事实上,它有几个较少的条件,因为我知道,高点是列表的长度,低点是0。然而由于某种原因,内置函数的运行速度是我的5倍。 我的代码如下: 内置函数的源代码是: 正如你所看到的,几乎完全相同。然而,my函数(在100000字的有序列表中

  • 我使用以以下命令开头mysql映像 当docker在后台运行时,另一个应用程序连接到端口3306大约需要一分钟的时间。 之后,我用停止这个容器,然后用启动它。在第二种情况下,使用start命令,应用程序可以连接到端口3306,仅在5秒后。 现在我用从停止的容器中获取快照,并用运行它,但是在这种情况下,应用程序可以在一分钟后连接到mysql2! 所以, 是否有任何方法在运行容器后采取快照,可以在10

  • 问题内容: 我发现这一点的同时解决问题205的项目欧拉。问题如下: 彼得有九个四面(金字塔形)骰子,每个骰子的编号分别为1、2、3、4。科林有六个六边形(立方)骰子,每个骰子的编号为1、2、3、4、5、6。 彼得和科林掷骰子并比较总数:最高的总胜利数。如果总数相等,则结果为平局。 金字塔形皮特击败立方柯林的概率是多少?以0.abcdefg的形式将答案四舍五入到小数点后七个位 我用番石榴写了一个幼稚

  • 据我所知,流比传统的旧编程更快。 然而,当我运行下面的代码时,结果是我没有预料到的。 输出为:22857304

  • 问题内容: 我正在经历 递增/递减运算符 ,并且 遇到了这样的情况:如果在这种情况下以递减形式运行循环,则其运行速度将比相同的以递增形式运行的循环快。 我期望两者将花费相同的时间,因为将遵循相同数量的步骤。我在网上搜索,但找不到令人信服的答案。是因为与增量运算符相比,减数运算符花费的时间更少吗? 问题答案: 这是因为在字节码中,与0比较与与非零数字比较是不同的操作。实际需要先将数字加载到堆栈上,然

  • 这是我在解决欧拉项目205题时发现的。问题如下: 彼得有九个四面(金字塔形)骰子,每个骰子的面编号为1、2、3、4。科林有六个六面(立方体)骰子,每个骰子的面编号为1、2、3、4、5、6。 彼得和科林掷骰子比较总数:总数最高的赢。如果总数相等,结果是平局。 金字塔皮特击败立方体科林的概率是多少?将答案四舍五入至小数点后七位,格式为0.abcdefg 我用Guava写了一个简单的解决方案: 我所强调