0

我一直在阅读关于并行流的这个article。这段时间非常漫长,我理解了所有内容都涉及到并行流如何工作。我将引用的部分,我很难理解:需要帮助了解关于并行流性能增益的文章

“并行化要求: 线程池来执行的子任务, 除以初始任务为子任务, 分发子任务线程, 整理结果 没有进入细节,这一切都意味着一些开销,它会表现出惊人的结果时:

  • 有些任务意味着阻止了很长的时间,比如访问远程服务或

  • 没有太多的线程同时运行,特别是没有其他并行流。

如果所有子任务意味着强烈的计算,潜在收益受可用处理器数量的限制。 Java 8将默认使用尽可能多的线程,因为它们是计算机上的处理器,因此,对于密集型任务,结果高度依赖于其他线程可能在同一时间进行的操作。 当然,如果每个子任务基本上都在等待,增益可能看起来很大。

我不明白的2个报表上面的粗体字突出

第一句话:有些任务意味着阻止了很长的时间,比如访问远程服务

我的理解在并行编程环境中执行相同的任务,而不是并行处理环境,性能增益会很大:相对

这一个:当然,如果每个子任务基本上都在等待,增益可能会很大。

我不知道作者在这里的意思。

+1

他们说,对于非计算有限的任务,并行化(或实际上,并发)将导致性能增益不受计算资源总量的限制。 –

+0

不,对不起,我还是不明白。 – njk2015

回答

1

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

它会显示令人惊叹的结果,当...没有太多的线程在同一时间运行,特别是没有其他并行流。

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

这是并行化真正发挥的地方。如果将任务分成10个子任务,并在每个子任务中运行它们,则它们可以同时提交查询并等待结果,这意味着整体只有1秒的停机时间。由于子任务是阻止,而不是计算,您不受可用系统资源的限制。唯一的限制是你可以在多大程度上逻辑分解单个任务。因此,

当某些任务意味着长时间阻塞,如访问远程服务时,它将显示惊人的结果...如果每个子任务基本上正在等待,增益可能看起来很大。

+1

当然,这很大程度上取决于远程服务并行处理并行处理这些请求的能力。在最坏的情况下,你什么也得不到... – Holger

+0

很好的答案,谢谢你! – njk2015