
比较以下三者,性能优先,考虑不同的任务量大小、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 都是最优选择?
1 wxkvEX 2018 年 4 月 14 日 via iPhone 很明显不是,并行流并不是无脑用的,我遇到过因为并行导致执行错误的情况,没个几十万几百万乖乖用普通的流就行 |
2 yidinghe 2018 年 4 月 14 日 如果循环体很小且调用频繁(这类循环属于很细节的操作,通常不会考虑并发),那么用 forEach 或 streaming 可能性能上不划算,还是用 for-index 循环好一点。除此之外我觉得用哪种方式性能上区别不大。 至于 IO 密集,我觉得对所有的循环方式影响都一样,因为如果瓶颈在 IO 上,那么 CPU 负载就不高。 |
3 richard1122 2018 年 4 月 14 日 而且还要注意有没有里面的代码依赖了 thread local,之前我们曾经有逻辑开始用了并行 stream,后来里面某一块改了,依赖了 thread local。 |
4 BBCCBB 2018 年 4 月 14 日 forEach 和 for 一样的,只是提供了一个语法糖而已, 小数据量 for 性能是比 stream 好的,stream 要分解任务,合并结果等。开销较大, 普通的 for 还可以在知道数据量大小的时候优先分配固定的空间。 |
5 asj 2018 年 4 月 15 日 via Android 在于函数式写法描述逻辑更清楚的情况下选择 Stream,没有特殊理由不应该特意关注性能。 如果真的性能是第一位的,那就用 for。要并行完全可以自己手写多个线程分别 for 集合的一部分。 |
6 wizardforcel 2018 年 4 月 15 日 via Android @wxkvEX 这就属于 jvm 的 bug 了。对于相同的方法序列,它们的结果应该相同。 |