当前位置: 首页 > 面试题库 >

如果可能,是否应该始终使用并行流?

锺英彦
2023-03-14
问题内容

使用Java 8和lambda,可以很容易地将集合作为流进行迭代,也很容易使用并行流。docs中的两个示例,第二个示例使用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()));

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

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

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


问题答案:

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

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

  • 我首先遇到性能问题

  • 我尚未在多线程环境中运行该流程(例如:在Web容器中,如果我已经有许多并行处理的请求,则在每个请求中添加额外的并行度层可能会产生多于积极影响的负面影响)

在您的示例中,无论如何,性能都将受到对的同步访问的驱动System.out.println(),并且使此过程并行不会产生影响,甚至不会产生负面影响。

此外,请记住,并行流并不能神奇地解决所有同步问题。如果过程中使用的谓词和函数使用了共享资源,则必须确保所有内容都是线程安全的。尤其是副作用,如果并行使用,那么您真的要担心。

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



 类似资料:
  • 使用Java 8和lambdas可以很容易地将集合作为流进行迭代,使用并行流也同样容易。文档中的两个示例,第二个使用ParallelStream: 只要我不关心顺序,使用平行会一直是有益的吗?人们会认为在更多的核心上分配工作是更快的。 还有其他考虑吗?什么时候应该使用并行流,什么时候应该使用非并行流? (问这个问题是为了引发关于如何以及何时使用并行流的讨论,而不是因为我认为始终使用它们是一个好主意

  • 问题内容: 我们必须一直构建String以便进行日志输出等等。在JDK版本中,我们了解了何时使用(很多追加,线程安全)和(很多追加,非线程安全)。 有什么使用建议?是高效的,还是在性能很重要的情况下我们被迫坚持采用单线连接? 例如丑陋的旧风格, 对比整齐的新样式(String.format,可能会更慢), 注意:我的特定用例是整个代码中数百个“单行”日志字符串。他们不涉及循环,所以太重了。我特别感

  • AccessibilityService在系统的内存管理方面与普通服务有何不同? 我想问的是:系统可以为了节省内存而关闭AccessibilityService吗?如果可以,当您进入AccessibilityService时,您会看到它打开还是关闭?用户是否必须再次手动打开? 使用startForeground是否有助于使AccessibilityService保持活动状态? 在一个类似的问题中,

  • 问题内容: 在Java <1.5中,常量将像这样实现 并且您可以像这样使用它: 现在,显然在1.5中,您应该使用枚举: 现在您可以像这样使用它: 我觉得有点难看。现在,我可以轻松添加几个静态变量: 现在,我可以再次执行此操作: 具有枚举的所有类型安全性。 这是好风格还是坏风格?您能想到更好的解决方案吗? 更新资料 Vilx-是第一个强调我所缺少的东西的人-枚举应该是一等公民。在Java中,这意味着

  • 问题内容: 为什么或者为什么不? 问题答案: 对于性能而言,尤其是在较大范围内进行迭代时,通常会更好。但是,在某些情况下,你可能更喜欢: 在Python 3,range()做什么用做的,不存在。如果要编写可在Python 2和Python 3上运行的代码,则不能使用。 在某些情况下实际上可以更快-例如。如果多次重复相同的序列。 xrange()每次都必须重新构造整数对象,但是range()将拥有真

  • 问题内容: 我是redis的新手,应该使用流水线操作时还是有些困惑,或者应该在发送多个命令时始终使用它? 例如,如果我想一次向Redis服务器发送10条SET命令,我是否应该简单地一个接一个地运行这10条命令,还是应该对它们进行流水线处理? 用管道传输10条SET命令而不是一一发送它们有什么缺点吗? 非常感谢。 问题答案: 当我应该使用流水线 当需要向Redis发送许多命令时,管道用于减少RTT,