Java并行流中forEach()与forEachOrdered()执行速度差异原因求解
问题原因分析
- 核心瓶颈来自
System.out.println的同步开销:System.out是线程安全的PrintStream实现,所有println方法都内置synchronized同步锁,多线程并发调用时会产生大量锁竞争、上下文切换开销,这是本次测试中占比最高的耗时来源。 parallel().forEach()的执行逻辑:并行流的forEach不会保留顺序,每个工作线程处理完自己分片内的单个元素后,就会立刻尝试调用println输出,多个线程会持续争抢System.out的锁,10000次输出对应上万次锁竞争,额外开销极高,因此总耗时更长。parallel().forEachOrdered()的执行逻辑:并行流的forEachOrdered需要保证输出顺序和源流顺序一致,因此内部实现是先让各并行线程完成自己分片的元素处理,之后由单线程按全局顺序统一调用println输出,全程没有多线程锁竞争,省掉了大量锁切换、等待的开销,因此总耗时反而更短。
注意:本次测试结果不代表两个API的通用性能表现。你当前的测试用例把IO操作作为最终执行逻辑,瓶颈完全在IO同步上,没有体现流本身的计算性能。如果你把执行逻辑替换为无同步的计算操作(比如元素累加、写入无锁数组等),
forEach的性能会明显高于forEachOrdered,符合你原本的预期。
内容的提问来源于stack exchange,提问作者ilovek
相关产品推荐
相关产品推荐

