流并行&核心数量

时间:2014-10-07 20:44:39

标签: java multithreading parallel-processing java-stream

我在I7上用4核运行我的应用程序。 我有大约10个在后台运行的线程。 除了10个线程,我有一个算法,我可以用parallelStream重写它,但我不确定它会给我更好的性能。(该应用程序不是确定性的,所以它不会是准确地比较两种方式之间的表现(有或没有平行)。

如果我有4个核心,并且我已经有10个线程,那么并行编写其他算法是对的吗?

1 个答案:

答案 0 :(得分:2)

Doug Lea初步概述了何时在流中使用并行。您可能想要阅读他要说的内容here

他点击了一些问题。但是,这一切都取决于处理器的数量。如果你没有马力,那么你就不会飞。以下内容摘自我维护的Data Parallelism产品的文档:

经过所有的喘气和膨胀,科学计算和耗时的测试,如果你没有足够的处理器来分配工作,并且有足够的处理器来处理负载,那么并行化不会让你失败脱掉袜子。并行化可能会使处理速度变慢:

如果您有P个处理器和8个(P)并发请求,那么每个请求使用一个线程通常对吞吐量更有效。分解的收支平衡点大于8(P),具体取决于应用。这里的逻辑很简单。如果您有可用的P处理器,并且相应地拆分了您的工作,但是您前面还有数百个其他任务,那么拆分的重点是什么?按顺序处理每个请求可能会更快。

使用双核机器作为并行引擎并不能很好地运行。四核更好但仍然有点缺乏。查看操作系统报告的线程数时要小心。今天许多机器都使用同步多线程(SMT)。虽然SMT适用于通用计算,但当所有硬件线程都参与时,它通常会损害计算密集型功能的性能。使用Java Runtime.getRuntime()。availableProcessors()并不总是返回硬件线程的数量。指定会话的线程数可能与物理环境无关。