在计算机科学领域,性能优化是提升程序效率的关键步骤。然而,传统的性能分析工具往往只能告诉哪些代码频繁执行或者执行时间较长,但它们并不能有效地指导在并行程序中进行优化。在2015年的SOSP会议上,一篇名为“因果分析”的论文获得了最佳论文奖,它提出了一种新的性能分析方法,旨在解决这一问题。
因果分析的核心思想是,在程序执行期间进行性能实验,通过“虚拟加速”代码来量化潜在优化的影响。具体来说,它不是直接加速某段代码的执行,而是通过插入暂停来减慢其他同时运行的代码,从而产生相同的相对效果。这种方法的关键在于,它试图找出加速给定代码块对程序整体运行时间的影响。
例如,如果想要优化代码块f,因果分析不是直接让f运行得更快,而是通过减慢g的执行来实现。这样,就可以推断出,如果在f中看到的加速效果,那么在g中减慢的效果将具有相同的相对影响。
现有的性能分析工具通常只能告诉哪些代码频繁执行(调用次数)以及哪些代码运行时间较长(总时间的百分比)。但是,它们并不能帮助找到并行程序中的重要代码,这正是因果分析所解决的问题。论文中给出了一个简单的例子,展示了现有分析工具的不足。
论文中提到的一个例子是,优化函数a可以提高性能4.5%,而优化函数b对性能没有影响。然而,常规的性能分析工具会显示a和b在总运行时间中占相似的比例(分别为55.20%和44.19%)。但是,使用因果分析工具,它预测优化a中的第二行代码可以将整体运行时间提高4-6%,而优化b只会提高不到2%。
因果分析的研究不仅仅局限于构造的程序,它还应用于多个真实世界的项目,包括SQLite、PARSEC基准测试套件、dedup(下一代数据去重压缩工具)和ferred(内容相似性搜索服务器)。Charlie Curtsinger(Coz的作者之一)的演讲显示,Coz在多个情况下识别出了传统性能分析工具可能会错过的优化区域。例如,他们发现SQLite中的一个函数,优化后可以提高25%的速度,但实际上在这个函数中花费的时间只有0.15%,因此它不会出现在传统性能分析工具的输出中。
值得注意的是,Coz目前是一个原型因果分析工具,它只在Linux上运行,但不需要修改可执行文件。然而,论文中提出的思想可以移植到其他操作系统、编程语言或运行时。例如,已经开始在Go运行时中实现Coz,只需要对运行时进行少量修改即可运行原型。