java - 如果可能的话,我应该总是使用并行流?

  显示原文与译文双语对照的内容
120 4

使用 Java 8和 rtc,可以以很容易地将集合作为流循环,并且简单地使用并行流。来自的两个示例,文档,第二个使用 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()));

只要我不关心这个订单,那么使用并行的方法是有益的。人们会认为把工作分成更多的内核是更快的。

是否有它的他注意事项当应该使用并行流时,应当何时使用非并行?

这个问题被要求触发关于如何和什么时候使用并行流的讨论,而不是因为我认为总是使用它们是个好主意。

时间:原作者:0个回答

89 5

并行流比顺序流的开销要高得多。协调线程需要大量的时间。默认情况下,我将使用顺序流,并且仅考虑

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

  • 我第一次遇到性能问题

  • 我还没有在多线程环境中运行该进程( 例如:在web容器中,如果我已经经有许多请求并行处理,请在每个请求中添加一层并行性。

在你的示例中,性能将由同步访问 System.out.println() 驱动,并且使这里过程并行无效,甚至是负数。

此外,记住并行流不会神奇地解决所有同步问题。如果共享资源由流程中使用的谓词和函数使用,则必须确保所有内容都是线程安全的。特别是,如果你平行,副作用是你真正需要考虑的事情。

在任何情况下,不要猜测 !只有度量值才会告诉你平行度是否值得。

原作者:
...