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

为什么在这个片段中并行执行的时间比顺序执行的时间长?[副本]

黄成荫
2023-03-14

以下代码的并行执行比顺序代码所需的时间长。我知道并行流比顺序流有更多的复杂性和更高的成本,我们不能期望并行流一直都能创造奇迹。我只是关心下面的代码

List<Integer> collect = IntStream.rangeClosed(1, 1000000)
    .unordered()
    .parallel()
    .filter(e -> e%7 == 0)
    .boxed()
    .collect(Collectors.toList());

    long endTime = System.nanoTime();

    collect.forEach(System.out::println);
    System.out.println(endTime - startTime);

输出:

>

  • 具有顺序流:40 227 795

    并行流:74 656 768

    这个流有状态吗?如果不是,那么为什么平行流要花更长的时间呢?这背后的原因可能是什么?对此能有一个精确的猜测吗?

  • 共有1个答案

    强安和
    2023-03-14

    并行处理的唯一事实并不总是意味着这将比顺序处理快。这是编程中一个相当复杂的话题。这里有一个关于C#中这件事的主题。但它也可以应用于Java。

    简而言之,创建新线程是一个非常昂贵的操作,而且创建它确实需要时间。还有,在多线程环境中工作需要,所谓的上下文切换,与这样一个事实有关,即进程通常比实际的核心多,因此它们在做一些操作时需要共享核心,这也是相当昂贵的。您可以在这里找到一些温和的介绍,不涉及任何特定的编程语言,而是集中于一般的问题。

     类似资料:
    • 我有一个用Scala写的程序。我想测量不同独立代码块的执行时间。当我以明显的方式(即在每个块之前和之后插入)时,我观察到执行时间取决于块的顺序。前几个块总是比其他块花更多的时间。 我创建了一个再现这种行为的极简示例。所有代码块都是相同的,为了简单起见,为整数数组调用。 运行和的程序后,我的控制台如下所示: HashCodeExperiment耗时14.630283毫秒 HashCodeExperi

    • 我目前使用的是mysql 我有两个名为person和zim_list_id的表,这两个表都有超过200万行

    • 问题内容: 我有一个“长期运行的”清理行动,我需要执行我的。做这个的最好方式是什么? 如果我使用a 这样做,我将立即返回;但是线程引用发生了什么?我正在寻找有关此处需要了解的任何影响/陷阱/绊网的建议,因为我认为即使活动被销毁,该流程仍将继续存在。 背景: 我在我的应用程序中使用JmDNS。当用户使用完我的应用程序后,我想清理JmDNS实例。我使用类方法进行此操作。但是,此方法需要 5秒钟以上 才

    • 我试图在这个页面上无限滚动,下面是我的代码: 因此,当我运行此程序时,它会在执行任何滚动之前等待很多秒(有时超过1分钟),然后在下次滚动之前再次等待相同的时间。代码在其他页面上似乎运行良好。有没有办法解决这个问题? 当我尝试使用Chrome而不是firefox时,会出现以下错误:添加到。py文件。

    • Hprose 中间件的顺序执行是按照添加的前后顺序执行的,假设添加的中间件处理器分别为:handler1, handler2 … handlerN,那幺执行顺序就是 handler1, handler2 … handlerN。 不同类型的 Hprose 中间件和 Hprose 其它过程的执行流程如下图所示: +--------------------------------------------