Coz:使用因果分析查找有价值的代码 - 简介





5.00/5 (2投票s)
Coz:使用因果分析查找有价值的代码 - 简介
不久前,我偶然读到了一篇题为《COZ:使用因果剖析查找有价值的代码》的有趣且易于阅读的论文,该论文在SOSP 2015上发表(并获得了最佳论文奖)。这篇博文是我尝试为不想通读整篇论文的任何人介绍因果剖析。
什么是“因果剖析”?
以下是论文本身的解释:
与过去的剖析方法不同,因果剖析准确地指出了程序员应将优化精力集中在哪里,并量化了其潜在影响。因果剖析通过在程序执行期间运行性能实验来工作。每个实验通过虚拟加速代码来计算任何潜在优化所产生的影响:插入暂停,从而减慢所有其他并发运行的代码。关键的见解是,这种减速与使该行运行得更快具有相同的相对效果,从而“虚拟地”加速了它。
如果您愿意,下面是论文中解释其功能的图(单击放大):
关键部分是它试图找出加速给定代码块对程序整体运行时间的影响。但是,能够加速任意代码片段非常困难,如果作者能做到这一点,那么他们最好通过出售代码优化工具来赚大钱。因此,他们没有加速给定代码片段,而是人为地减慢了所有同时运行的其他代码,这具有完全相同的相对效果。
在上图中,Coz 试图确定优化代码块f
对整体运行时间的影响。他们没有像(b)部分所示那样使f
运行得更快,而是通过插入暂停来减慢g
的运行速度,请参见(c)部分。然后,Coz 可以推断出,如果f
运行得更快,那么(c)中看到的加速将具有相同的相对效果,因此(b)中所示的“实际加速”是可能的。
不幸的是,Coz 不会告诉你如何加速你的代码,这留给你自己,但它会告诉你你应该关注代码的哪些部分才能获得最佳的整体改进。或者换句话说,Coz 告诉你:
如果你能将给定代码块加速这么多,程序就会跑得这么快。
现有剖析器
在论文中,作者认为现有的剖析器仅告诉你:
- 频繁执行的代码(调用次数)
- 运行时间长的代码(占总时间的百分比)
它们不能帮助你找到并行程序中的重要代码,而这正是 Coz 解决的问题。他们给出的(人为的)例子是:
void a() { // ˜6.7 seconds for(volatile size_t x=0; x<2000000000; x++) {} } void b() { // ˜6.4 seconds for(volatile size_t y=0; y<1900000000; y++) {} } int main() { // Spawn both threads and wait for them. thread a_thread(a), b_thread(b); a_thread.join(); b_thread.join(); }
他们称之为
..一个简单的多线程程序,说明了现有剖析器的缺点。优化 f
a
最多只会提高 4.5% 的性能,而优化 fb
则对性能没有任何影响。
如下面的比较所示(单击可放大),普通剖析器显示 fa
和 fb
都占用了相似比例的总运行时间(分别为 55.20% 和 45.19%)。但是,通过使用因果剖析器,它预测优化 fa
中的第 2 行会将整体运行时间增加 4-6%,而优化 fb
只会增加 < 2%。
结果
然而,他们的研究不仅仅是在人为设计的程序上进行的,他们还考察了几个实际项目,包括:
- SQLite
- PARSEC 基准套件
- dedup - 下一代数据去重压缩
- ferred - 内容相似性搜索服务器
来自 Charlie Curtsinger(Coz 的作者之一)的一次演示文稿的结果表明,在几种情况下,Coz 识别出了常规剖析器会错过的优化领域。例如,他们发现 SQLite 中一个函数在优化后提供了 25% 的加速,然而在该函数中实际花费的时间很少,仅为 0.15%,因此它不会出现在常规剖析器的输出中。
项目 | Coz 加速 | 剖析器报告的运行时百分比 |
SQLite | 25% | 0.15% |
dedup | 9% | 14.38% |
ferred | 21% | 0.00% |
您可以交互式查看器中探索这些结果,该查看器是与该工具一起开发的。例如,下图显示了 SQLite 源代码中 Coz 识别出的影响最大(正面或负面)的代码行(单击可查看完整尺寸版本):
摘要
值得指出的是,Coz 目前是一个原型因果剖析器,目前只能在 Linux 上运行,但不需要你修改可执行文件。然而,论文中提出的思想可以移植到其他操作系统、编程语言或运行时。例如,已经开始开发一个Go 版本,该版本只需要对运行时进行少量修改即可运行原型。
很高兴看到 .NET 也有类似的东西,有人愿意尝试吗?
更多信息
如果您想了解更多关于 Coz 的信息,这里有一份有用的链接列表:
- Coz 论文《查找有价值的代码:因果剖析》
- 来自“the morning paper”博客的全面的(且更深入的)总结
- Coz GitHub 仓库
- Charlie Curtsinger(Coz 的作者之一)的演示文稿
- Go 因果剖析是尝试在 Go 运行时中实现 Coz 的一个项目
博文 Coz:使用因果剖析查找有价值的代码 - 简介 最初发布在我的博客 性能即特性!上。
CodeProject