分析和优化Java流
摘要:流API是在Java 8中添加的,允许以声明式方式表达数据处理逻辑,通常用于集合和数据集上的类似map-reduce的数据转换。流API引入了两个关键抽象:流,是数据源中可用的元素序列;流管道,包含在执行过程中应用于流中元素的操作(如map、filter、reduce)。流在Java开发者中变得流行,因为它们利用了函数式编程的简洁性和数据处理的并行化的便利。 尽管相对于依赖于命令式代码的数据处理而言,流具有很多优点,但流可能会引入显著的开销,这主要是由于额外的对象分配和回收,以及虚拟方法调用所导致的。因此,开发者需要手段来研究流的运行时行为,以减轻这种抽象开销并优化流处理。不幸的是,缺乏专门的工具能够动态分析流,帮助开发者明确定位降低应用性能的问题。 在本文中,我们讨论了流的分析和优化。我们提出了一种新颖的分析技术,用于以所花费的参考周期对流执行的计算进行测量,我们使用这种技术来找到对应用性能具有重大影响的问题流。虽然准确性对于这一目标至关重要,但插入的仪器代码会导致执行额外的参考周期,这些周期在分析中部分包含。为了减轻这个问题,我们估计和补偿插入的仪器代码引起的额外周期。 我们在StreamProf中实现了我们的方法,据我们所知,这是第一个针对Java虚拟机(JVM)的专门的流分析器。通过StreamProf,我们发现循环分析对于检测出问题的流并进行优化以实现显著性能提升是有效的。我们还发现,对支持并行流处理的任务进行准确分析,可以根据线程级别上与流相关的周期分布来诊断负载不平衡。 我们对公开可用的三个不同来源的顺序和并行流工作负载进行了评估。评估结果显示我们的分析技术高效且产生准确的分析结果。此外,我们通过对Renaissance中的两个工作负载进行流相关的优化来展示我们的分析结果的可操作性。我们的优化只需要修改几行代码,同时实现了最多5倍的加速比。 最近的研究广泛探讨了Java流,重点关注开发者如何使用流和如何优化它们。目前在流的优化方面的方法主要依赖于静态分析技术,忽视了运行时信息,存在重要限制以检测Java应用程序中执行的所有流,或者不适用于并行流的分析。了解顺序和并行流处理的动态行为及其对应用性能的影响对于帮助用户在使用流时做出更好的决策至关重要。
作者:Eduardo Rosales (USI Lugano, Switzerland), Matteo Basso (USI Lugano, Switzerland), Andrea Ros`a (USI Lugano, Switzerland), Walter Binder (USI Lugano, Switzerland)
论文ID:2302.10006
分类:Programming Languages
分类简称:cs.PL
提交时间:2023-02-21