acm-header
登录

ACM通信

研究突出了

技术视角:用Coz测量优化潜力


当程序员想要提高程序的性能时,他们通常会求助于分析程序来告诉他们要优化哪些代码。分析器可以测量程序行为的许多方面,例如每个方法通常被调用多少次,每个方法通常需要多长时间,以及哪些方法通常位于关键路径上。不幸的是,这些信息并不总是相关的,它常常会导致程序员将时间浪费在对总体性能影响不大的优化上。

特别是,传统的分析器很难帮助开发人员优化多线程程序。一个简单但有用的例子是一个程序,其中一个初始线程等待几个工作线程完成。如果每个worker运行的时间大致相同,那么大多数分析器将报告每个worker占用相同的执行时间份额。与此同时,优化任何单个的worker对总体执行时间的影响都是最小的,因为程序只有在所有的worker都完成之后才会完成。程序员可能会浪费无数小时优化代码,却不能让程序运行得更快。

在接下来的论文中,Curtsinger和Berger描述了一种更好的方法,称为因果分析;因果分析器会告诉程序员,他们在优化过程中需要多少加速。也就是说,因果分析器可以以令人毛骨悚然的准确性进行预测,从而加速一行代码x %将通过以下方式提高整体响应能力或吞吐量y %。乍一看,这似乎是魔法。没有任何工具可以使任意一行代码任意变快,然后测量加速后的代码行对整体执行时间的影响。然而Curtsinger和Berger开发了一种叫做Coz的工具,似乎可以完成不可能的事情。

Coz的关键观察结果是,任意加速代码是不可行的,但是任意减慢代码是相当容易的,所有工具要做的就是调整代码片段的相对速度,以便预测一个片段的变化将如何影响整体性能。换句话说,Curtsinger和Berger意识到可以通过以下方法来衡量加速目标代码片段的影响x %把所有东西都减速,除了目标x %并衡量整体放缓。这种奇妙的技术被称为虚拟加速,它是我在过去几年里最喜欢的工作之一。使用虚拟加速进行代码分析是一个非常聪明、简单和强大的想法,您希望自己能想到它。


虽然Coz背后的见解不可否认是聪明的,但其实现和评估结果同样令人印象深刻。


虽然Coz背后的见解不可否认是聪明的,但其实现和评估结果同样令人印象深刻。从概念上讲,每当Coz运行目标行代码时,它会通过小于目标行平均运行时的延迟暂停所有并行线程。但是,在每次执行目标行时naïvely暂停线程将需要大量的代码插装,这可能会严重歪曲结果并破坏分析器的效用。相反,Coz使用轻量级采样方案,完全不需要任何仪器。在Coz中,每个线程维护一个本地计数器,并使用Linux与CPU硬件性能计数器的接口定期对其程序计数器和堆栈进行采样。当线程发现它正在执行目标方法时,它会增加全局计数器。当另一个线程处理它的示例时,它将其本地计数器的值与全局计数器的值进行比较,如果本地计数器落后,则增加计数器的值并暂停线程。这种抽样方案非常优雅,它允许Coz通过简单地调整延迟和抽样周期的比率来设置执行的虚拟加速。

最后,事实证明,科斯的预测在很大范围的基准上都是准确的。也许最令人印象深刻的是,作者使用Coz修复了部署哈希表中一个非常糟糕且长期存在的性能bug。Coz报告说,文件压缩应用程序中最大的优化机会是一种遍历哈希表桶链表的方法。Coz继续识别这条特殊的线,即使在作者增加了桶的数量之后。经过仔细检查,作者发现表的哈希函数只将条目分配给3%的可用桶。修复有bug的哈希函数需要更改三行代码,并导致近9%的端到端基准测试加速。Coz不仅识别了错误并预测了修复的影响,还允许作者在短短几个小时内发现并解决问题。

最重要的是,Coz值得注意的是它例证了最好的系统工作:它是优雅的、深刻的和实用的。同时具备所有这些品质的论文是极其罕见的,我怀疑从业者和研究人员在未来的许多年里还会继续回归它。

回到顶部

作者

兰德勒·p·考克斯是美国北卡罗来纳州达勒姆市杜克大学计算机科学系的副教授。

回到顶部

脚注

要查看随附的论文,请访问doi.acm.org/10.1145/3205911


版权归所有者/作者所有。
向所有者/作者请求(重新)发布权限

数字图书馆是由计算机协会出版的。版权所有©2018 ACM, Inc.


没有发现记录

登录为完全访问
»忘记密码? »创建ACM Web帐号
文章内容:
Baidu
map