为什么Java 8中的IntStream.range(0,n)不应该是并行的?

时间:2015-05-02 05:54:42

标签: java java-8 java-stream

我已经阅读了一本关于Java 8的书,该书说使用并行流来获取IntStream.range(0,someNumber)的数字范围可能比连续的数字慢......为什么会这样?

3 个答案:

答案 0 :(得分:1)

它可能会慢一些。默认情况下,您应始终使用顺序流。与顺序流相比,并行流具有更高的开销,因为它需要在内部进行大量协调工作以及某些簿记活动。

如果符合以下条件,您应该考虑并行 1.您需要处理大量项目,每个项目都需要大量时间并且可以并行化。 2.如果您首先遇到性能问题。因此,在尝试并行流或任何其他并发构造之前,黄金法则始终是基准。

在您的情况下,如果范围非常小,那么在这种情况下,与并行流关联的开销可以覆盖您应该获得的好处。另请查看以下文章:http://zeroturnaround.com/rebellabs/java-parallel-streams-are-bad-for-your-health/

答案 1 :(得分:1)

这在很大程度上取决于场景。处理器上有一个开销来启动并行线程并处理它们。因此,如果您希望运行的进程不会花费太多时间,那么这将浪费CPU周期。

另一方面,我正在编写一种数据生成方法。为此,我使用并行流,它至少提高了4倍的性能。在我的例子中,每个并行线程负责在数据库中进行多次读写操作,因此每个线程的处理时间非常长。

P.S。:您可以设置属性:java.util.concurrent.ForkJoinPool.common.parallelism。如果您编写的进程取决于并行线程的数量,这将非常有用。默认情况下,.parallel()将为每个核心启动一个线程。

答案 2 :(得分:0)

在使用 parallelStream () 之前,请阅读:

  1. 它是多线程的。在 Java 中,仅仅编写 parallelStream() 来获得并行性几乎总是个坏主意。在某些情况下它会起作用,但并非总是如此。还有其他方法可以实现并行性,而且几乎总是如此,在采用多线程解决方案之前,您需要考虑很多。
  2. 它使用默认的 JVM 线程池。因此,如果您正在执行任何阻塞操作,例如网络调用,则整个 java 应用程序可能会卡住。那是那里最大的问题。还有其他一些任务分配。具有 n 线程的简单 ExecutionService 可提供比并行流更好的性能。

您还可以阅读: Java Parallel Streams Are Bad for Your Health! | JRebel by Perforce