【问题标题】:Need help understanding an article on parallel stream performance gains需要帮助理解一篇关于并行流性能提升的文章
【发布时间】:2017-06-17 18:36:46
【问题描述】:

我一直在阅读有关并行流的article。它很冗长,我理解了与并行流如何工作有关的所有内容。我将引用我难以理解的部分:

"并行化需要: 用于执行子任务的线程池, 将初始任务划分为子任务, 将子任务分配给线程, 整理结果。 如果不输入详细信息,所有这些都意味着一些开销。它会在以下情况下显示惊人的效果:

  • 某些任务意味着长时间阻塞,例如访问远程服务,或

  • 同时运行的线程不多,尤其是没有其他并行流。

如果所有子任务都意味着密集计算,则潜在收益受限于可用处理器的数量。默认情况下,Java 8 将使用与计算机上的处理器一样多的线程,因此,对于密集型任务,结果高度依赖于其他线程可能同时在做什么。 当然,如果每个子任务本质上都在等待,那么收益可能看起来很大。"

我不明白上面以粗体突出显示的 2 个陈述。

第一句:有些任务意味着长时间阻塞,比如访问远程服务

我的理解是,与在并发编程环境而不是并行处理环境中执行的相同任务相比,相对性能提升会很大?

这个:当然,如果每个子任务本质上都在等待,收益可能看起来很大。

我不知道作者在这里是什么意思。

【问题讨论】:

  • 他们说对于非计算受限的任务,并行化(或者实际上是并发)将带来不受计算资源总量限制的性能提升。
  • 不,抱歉,我还是不明白。

标签: java multithreading performance parallel-processing java-stream


【解决方案1】:

任何 CPU 密集型任务(例如,对数组进行排序)都会占用一部分 CPU 的处理能力。并行化允许您在多个内核之间拆分任务,以便您可以使用系统可用的所有处理能力。但是您的任务必须与其他也需要同时使用 CPU 的任务、线程池、进程、操作系统等竞争。因此,您可以从处理器中挤出多少计算能力总是有上限的。因此,

当...同时运行的线程不多,尤其是没有其他并行流时,它会显示出惊人的结果。

现在,假设您有一个需要进行 10 次数据库调用的任务。这些调用中的每一个都需要 1 秒钟的时间让数据库运行查询、收集结果并将其返回给您。如果您在单个顺序线程中运行该任务,则这些数据库调用的执行时间总共将增加 10 秒,因为每个调用只能在前一个调用完成后运行。在这 10 秒内,您的程序基本上处于空闲状态,除了等待响应之外什么都不做。

这就是并行化真正大放异彩的地方。如果将任务拆分为 10 个子任务并在各自的线程中运行每个子任务,它们可以同时提交查询并等待结果,这意味着您总共只有 1 秒的停机时间。因为子任务是阻塞,而不是计算,所以您不受可用系统资源的限制。唯一的限制是您可以在多大程度上在逻辑上分解单个任务。因此,

当某些任务意味着长时间阻塞时,它会显示出惊人的结果,例如访问远程服务...如果每个子任务本质上都在等待,那么收益可能看起来很大。

【讨论】:

  • 当然,这在很大程度上取决于远程服务对这些并行发送的请求的并行处理能力。在最坏的情况下,你一无所获……
猜你喜欢
  • 2021-11-06
  • 2022-01-15
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2022-09-24
相关资源
最近更新 更多