Java8 Stream API 在什么情况下适用?

2018-04-14 12:00:26 +08:00
 lxy

比较以下三者,性能优先,考虑不同的任务量大小、IO 密集、CPU 密集

for vs forEach vs (parallelStream + forEach)

我觉得 forEach + parallelStream 性能最好( for 次之),毕竟有并发执行,应该比单线程的 for 或 forEach 快。但是我找到的文章比较的要么是 for vs forEach,要么是 stream vs parallelStream,有没有 for vs (forEach + parallelStream )的?

是不是在任何可并发执行的情况下 parallelStream + forEach 都是最优选择?

3262 次点击
所在节点    Java
6 条回复
wxkvEX
2018-04-14 12:29:51 +08:00
很明显不是,并行流并不是无脑用的,我遇到过因为并行导致执行错误的情况,没个几十万几百万乖乖用普通的流就行
yidinghe
2018-04-14 12:29:54 +08:00
如果循环体很小且调用频繁(这类循环属于很细节的操作,通常不会考虑并发),那么用 forEach 或 streaming 可能性能上不划算,还是用 for-index 循环好一点。除此之外我觉得用哪种方式性能上区别不大。

至于 IO 密集,我觉得对所有的循环方式影响都一样,因为如果瓶颈在 IO 上,那么 CPU 负载就不高。
richard1122
2018-04-14 13:49:56 +08:00
而且还要注意有没有里面的代码依赖了 thread local,之前我们曾经有逻辑开始用了并行 stream,后来里面某一块改了,依赖了 thread local。
BBCCBB
2018-04-14 18:25:45 +08:00
forEach 和 for 一样的,只是提供了一个语法糖而已, 小数据量 for 性能是比 stream 好的,stream 要分解任务,合并结果等。开销较大, 普通的 for 还可以在知道数据量大小的时候优先分配固定的空间。
asj
2018-04-15 08:03:23 +08:00
在于函数式写法描述逻辑更清楚的情况下选择 Stream,没有特殊理由不应该特意关注性能。
如果真的性能是第一位的,那就用 for。要并行完全可以自己手写多个线程分别 for 集合的一部分。
wizardforcel
2018-04-15 17:44:12 +08:00
@wxkvEX 这就属于 jvm 的 bug 了。对于相同的方法序列,它们的结果应该相同。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/446757

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX