【问题标题】:Streams in parallel & number of cores并行流和核心数量
【发布时间】:2014-10-07 20:44:38
【问题描述】:

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

如果我有 4 个核心,我已经有 10 个线程,是否可以并行编写附加算法?

【问题讨论】:

  • 只有算法可以并行化才有意义。另外,制作第一个版本的应用程序,运行一段时间,进行线程转储,寻找可利用的并行化,编写第二个版本是很有意义的。根据需要重复。

标签: java multithreading parallel-processing java-stream


【解决方案1】:

Doug Lea 对何时在流中使用并行有一个初步的概述。您可能想阅读他要说的here

他回答了一些问题。但是,这一切都归结为处理器的数量。如果你没有马力,那么你就不会飞。以下摘自我维护的数据并行产品的文档:

经过所有的大呼小叫、科学计算和耗时的测试,如果您没有足够的处理器来拆分工作,也没有足够的处理器来处理负载,那么并行化不会让您大吃一惊.并行化可能会使处理速度变慢:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2012-06-26
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多