最可靠方式是基准测试,需控制变量、避免干扰、选对数据规模:预热jit、关闭日志、用中位数;小数据串行更快,并行优势在5000万以上;三组等价逻辑对比,禁用非线程安全操作。

直接用基准测试对比耗时是最可靠的方式,关键在于控制变量、避免干扰、选对数据规模。
准备可复现的测试环境
确保测试不被JVM预热、GC或系统负载干扰:
- 用 JUnit 的 @Before 和 @After 统一记录起止时间,避免手动调用
System.currentTimeMillis()引入误差 - 运行前加几轮预热(比如先执行 3 次空流操作),让 JIT 编译器完成优化
- 关闭日志输出、避免
System.out.println—— 它本身是同步 I/O,会严重拖慢并行流表现 - 单次测试尽量在无其他 Java 进程干扰的环境下进行,或多次运行取中位数
构造合适的数据集规模
小数据集反而会让并行流变慢,因为拆分+合并+线程调度开销超过收益:
- 低于 10 万元素:串行流通常更快,不建议测并行
- 100 万~1000 万:开始体现差异,适合观察拐点
- 5000 万以上(如
LongStream.rangeClosed(0, 500_000_000L)):并行优势明显,实测常快 2~3 倍
写三组等价逻辑分别测试
保证处理逻辑完全一致,只换流类型:
- for 循环版:纯裸循环累加/映射/过滤,作为基线参考
-
串行 Stream 版:用
list.stream().map(...).filter(...).reduce(...) -
并行 Stream 版:仅把
.stream()换成.parallelStream(),或链式调用.stream().parallel()
注意:不要在并行流里混用非线程安全操作(如往 ArrayList 里 add),否则结果不可靠;统一用 collect(Collectors.toList()) 或 toArray() 收集。
额外验证点(进阶)
光看总耗时不全面,还需确认:
- 是否真用了多线程?打印
Thread.currentThread().getName()看是否出现ForkJoinPool.commonPool-worker-线程 - CPU 利用率是否提升?用系统监控工具观察多核是否被有效占用
- 任务是否 CPU 密集型?如果是文件读取、数据库查询等 I/O 操作,并行流往往无效甚至更慢
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











