小编典典

我应该尽可能使用并行流吗?

all

使用 Java 8 和lambdas,很容易将集合作为流进行迭代,并且使用并行流同样容易。文档中的两个示例,第二个使用parallelStream:

myShapesCollection.stream()
    .filter(e -> e.getColor() == Color.RED)
    .forEach(e -> System.out.println(e.getName()));

myShapesCollection.parallelStream() // <-- This one uses parallel
    .filter(e -> e.getColor() == Color.RED)
    .forEach(e -> System.out.println(e.getName()));

只要我不关心顺序,使用并行总是有益的吗?人们会认为将工作分配到更多内核上会更快。

还有其他考虑吗?什么时候应该使用并行流,什么时候应该使用非并行?

(问这个问题是为了引发关于如何以及何时使用并行流的讨论,而不是因为我认为总是使用它们是一个好主意。)


阅读 99

收藏
2022-03-06

共1个答案

小编典典

与顺序流相比,并行流的开销要高得多。协调线程需要大量时间。我会默认使用顺序流,并且只考虑并行流,如果

  • 我有大量的项目要处理(或者每个项目的处理需要时间并且是可并行的)

  • 我首先遇到了性能问题

  • 我还没有在多线程环境中运行该进程(例如:在 Web 容器中,如果我已经有许多要并行处理的请求,那么在每个请求中添加额外的并行层可能会产生更多的负面影响)

在您的示例中,无论如何,性能将由对 的同步访问驱动System.out.println(),并且使此过程并行将没有效果,甚至是负面的。

此外,请记住并行流并不能神奇地解决所有同步问题。如果进程中使用的谓词和函数使用共享资源,则必须确保一切都是线程安全的。特别是,如果并行运行,副作用是您真正需要担心的事情。

无论如何,测量,不要猜测!只有测量会告诉您并行性是否值得。

2022-03-06