【Java编程性能调优】Stream如何提高遍历集合效率?

【Java编程性能调优】Stream如何提高遍历集合效率?_第1张图片

  从大的设计方向上来说,Stream 将整个操作分解为了链式结构,不仅简化了遍历操作,还为实现并行计算打下了基础。
  从小的分类方向上来说,Stream 将遍历元素的操作和对元素的计算分为中间操作和终结操作,而中间操作又根据元素之间状态有无干扰分为有状态和无状态操作,实现了链结构中的不同阶段。
  在串行处理操作中,Stream 在执行每一步中间操作时,并不会做实际的数据操作处理,而是将这些中间操作串联起来,最终由终结操作触发,生成一个数据处理链表,通过 Java8 中的 Spliterator 迭代器进行数据处理;此时,每执行一次迭代,就对所有的无状态的中间操作进行数据处理,而对有状态的中间操作,就需要迭代处理完所有的数据,再进行处理操作;最后就是进行终结操作的数据处理。
  在并行处理操作中,Stream 对中间操作基本跟串行处理方式是一样的,但在终结操作中,Stream 将结合 ForkJoin 框架对集合进行切片处理,ForkJoin 框架将每个切片的处理结果 Join 合并起来。

合理使用 Stream

对常规的迭代、Stream 串行迭代以及 Stream 并行迭代进行性能测试对比,迭代循环中,将对数据进行过滤、分组等操作。分别进行以下几组测试:

  • 多核 CPU 服务器配置环境下,对比长度 100 的 int 数组的性能;
  • 多核 CPU 服务器配置环境下,对比长度 1.00E+8 的 int 数组的性能;
  • 多核 CPU 服务器配置环境下,对比长度 1.00E+8 对象数组过滤分组的性能;
  • 单核 CPU 服务器配置环境下,对比长度 1.00E+8 对象数组过滤分组的性能。

迭代使用时间:

  • 常规的迭代
  • Stream 并行迭代 < 常规的迭代
  • Stream 并行迭代 < 常规的迭代
  • 常规的迭代

在循环迭代次数较少的情况下,常规的迭代方式性能反而更好;在单核 CPU 服务器配置环境中,也是常规迭代方式更有优势;而在大数据循环迭代中,如果服务器是多核 CPU 的情况下,Stream 的并行迭代优势明显。所以平时处理大数据的集合时,应该尽量考虑将应用部署在多核 CPU 环境下,并且使用 Stream 的并行迭代方式进行处理。

你可能感兴趣的:(性能调优实战,性能调优)