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

Java中的流比本地for循环慢得多-为什么?[副本]

濮俊美
2023-03-14

据我所知,流比传统的旧编程更快。

然而,当我运行下面的代码时,结果是我没有预料到的。

public class Application {
    public static void main(String[] args) {
        long startTime = System.nanoTime();
        int[] a = { 1, 2, 3, 4 };
        int m = Arrays.stream(a).reduce(Integer.MIN_VALUE, Math::max);
        long endTime = System.nanoTime();
        long totalTime = endTime - startTime;
        System.out.println(totalTime);

    }
}

输出为:22857304

public class Application {
        public static void main(String[] args) {
        long startTime = System.nanoTime();
        int[] a = { 1, 2, 3, 4 };
        int e = a.length;
        int m = Integer.MIN_VALUE;
        for (int i = 0; i < e; i++)
            if (a[i] > m)
                m = a[i];
        long endTime = System.nanoTime();
        long totalTime = endTime - startTime;
        System.out.println(totalTime);
    }
}

共有1个答案

卫弘懿
2023-03-14

完全解释这一点需要很多时间;但是您在这里测试的是“冷”的开始,基本上没有太多JIT,简单的循环不像流解决方案那样分配对象--因此节省了很多时间。流有一个运行的基础结构--这需要一段时间来“加热”以变得更加性能化。

这些代码部分也不等价,在使用math::max的代码中,在使用普通的>的代码中。您可以反复测试这些代码并查看结果,但即使如此,您可能应该使用一个为微基准量身定制的工具,我知道JMH(以及来自google的Caliper--但我只信任第一个)。

使用JMH,您可以在根本不使用JIT的情况下测试这些方法,C1C2编译器,或者其他一些设置。有关一些设置的示例,请参见以下答案

 类似资料:
  • 为什么比: memcmp是CPU指令还是什么?它一定很深,因为我在循环中使用获得了巨大的加速。

  • 问题内容: 我写了一个非常简单的基准: 如果您运行的是Chrome,则可以在此处进行尝试(因为NodeJS和Chrome使用相同的JavaScript引擎,尽管通常版本略有不同): 结果令我惊讶: 我已经在Node 4.0.0 && 5.0.0 && 6.0.0中对其进行了测试,每个节点版本之间的和比例相同。 有人可以向我解释这种看似奇怪的行为的原因是什么? 问题答案: 基于vs. 的机制差异,这

  • 下面的代码将简单的值持有者映射到一个对象,它在Java中的运行速度比使用XCode 7 beta3“最快、积极的优化[-ofast]”的Objective-C快15倍以上。在Java中,我可以获得超过280m/sec的查找,但在objc示例中只有大约19m。(我在这里发布了相应的Java代码,因为这是作为一个Swift比较开始的:Swift Dictionary即使经过优化也很慢:是否不断保留/发

  • 当我开始我的代码 我得到无限循环。为什么?

  • 问题内容: 我有一个简单的任务:计算每个字母在一个字符串中出现的次数。我已经使用了它,但是在一个论坛上我看到了使用/比每个字母都要慢得多的信息。我认为它只能在字符串中进行一次遍历,而解决方案则必须遍历该字符串四次(在这种情况下)。为什么这么慢? 问题答案: 允许您计算任何可哈希对象,而不仅仅是子字符串。两种解决方案都是-time。您的测量结果表明,迭代和散列单个字符的开销大于运行4倍。 可以 使用

  • 我已经创建了一个使用流执行矩阵乘法的模块。可以在这里找到:https://github.com/firefly-math/firefly-math-lineal-real/ 当我在大小为100x100和1000x1000的矩阵上运行基准测试时,发现Apache Commons Math(使用for循环)比相应的流实现快10倍(大致)。 我在基准测试中做错了什么吗(希望是:))? 我添加了测试的方法