java - 需要帮助理解有关并行流性能提升的文章

标签 java multithreading performance parallel-processing java-stream

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

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

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

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

如果所有子任务都意味着密集计算,则潜在 yield 将受到可用处理器数量的限制。默认情况下,Java 8 将使用与计算机上的处理器一样多的线程,因此,对于密集型任务,结果高度依赖于其他线程同时执行的操作。 当然,如果每个子任务本质上都在等待,那么收获可能会显得巨大。

我不明白上面以粗体突出显示的两条语句。

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

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

这个:当然,如果每个子任务本质上都在等待,那么收获可能会显得巨大。

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

最佳答案

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

It will show amazing results when... There are not many threads running at the same time, and in particular no other parallel stream.

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

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

It will show amazing results when Some tasks imply blocking for a long time, such as accessing a remote service... if each subtask is essentially waiting, the gain may appear to be huge.

关于java - 需要帮助理解有关并行流性能提升的文章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44608106/

相关文章:

java - 如何让 Eclipse 在打开搜索结果时打开整个文件?

java - grep 命令不适用于 git blame 文件和 git log 以进行修订

java - 使用phpmyadmin中的服务器上的查询重命名mysql中的数据库名称

c++ - 这个简单的程序会有多少缓存未命中?

c++ - 文件夹和命名空间会影响 C++ 和跨平台的性能吗?

java - 使用 pdfbox 在 PDF 中获取正确(旋转)的图像尺寸

c# - 需要帮助以C#实现多线程

c# - 关于 C# RFID 线程的问题

java - 数据未存储到领域数据库中

Python:time.time() 与 time.clock() 之间有显着差异吗?