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