07 | 代码优化:跟编译器做朋友,让你的代码飞起来
该思维导图由 AI 生成,仅供参考
常见的代码优化方法
- 深入了解
- 翻译
- 解释
- 总结
编译器优化是提高代码性能的关键,本文介绍了常见的代码优化方法及其实现思路。从常数折叠和常数传播到循环优化和控制流优化,文章详细介绍了各种优化方法的原理和实现方式。针对循环的优化是编译器中的重点,因为循环是程序中最多的计算量消耗的地方。对循环做优化可以事半功倍,例如归纳变量优化、边界检查消除、循环展开、循环向量化等方法都能有效提高性能。此外,减少过程调用的开销也是重要的优化方向,包括尾调用优化、内联、内联扩展、叶子程序优化等方法。文章还介绍了代码优化所依赖的分析方法,包括控制流分析、数据流分析、依赖分析和别名分析等。最后,文章提到了优化方法的重要性和顺序,指出了不同优化方法的适用范围和优化的顺序。整体而言,本文详细介绍了编译器优化的各种方法和分析技术,对于想要深入了解编译器优化和提高代码性能的读者具有重要意义。
《编译原理实战课》,新⼈⾸单¥59
全部留言(3)
- 最新
- 精选
- qinsi有两个例子怀疑有误: “x*9”等价于“x<<3+1” ----------------- 怀疑是"(x<<3)+x" int j = 0; for (int i = 0; i < 100; i++) { j = 2*i; //2*i可以替换成j+2 } return j; ------------------------- 怀疑是"for (int i = 1; i <= 100; i++) {"
作者回复: 没错,你看得很细!感谢你! 我在文稿里改一下!
2020-06-162 - chris一直有两个关于各种优化算法与ssa的关系的困惑,不知老师能否解答: 1.现代编译器的优化流程,一般ssa从哪个阶段开始使用,到哪个阶段不再使用 2.在ssa的情况下,各种优化算法本身要发生什么变化,或者可能都变得不必要了
作者回复: 非常好的两个问题。 对问题1:ssa一般用在做机器无关的优化,也就是用于HIR和MIR。到了LIR,特别是做了寄存器分配算法以后,ssa中的值(或变量)的概念已经消失了,已经变成了对一个个物理寄存器的操作,一个物理寄存器在不同的时间对应的是不同的值,所以这个时候也就谈不到SSA了。 对问题2:优化算法会变得简单,而不是变得不必要。 比如,用非SSA的IR,要记录变量的use-def关系也是可以的,但要耗费更多的存储空间,记录更多的信息,才能达到跟SSA等价的程度。
2020-06-162 - humor值编号和公共子表达式都可以减少重复计算,值编号侧重于变量的值的重复,公共子表达式侧重于表达式的重复;如果有两个包含a,b两个变量的表达式,a,b两个变量的值相同,并且除了这两个变量之外的其他部分都相同的话,则可以用值编号来优化,不能用公共子表达式来优化。 感觉可以看明白这些优化都做了什么,但是到实际使用的时候可能只能想起来一点点……
作者回复: 总结得不错! 总的来说,编译器后端技术工程性比较强,所以不适合在学校里考试。所以,学校的的编译原理往往侧重前端部分。如果学后端部分,可以每种优化做一个课程实验的方式,由老师通过测试用例检验实际优化的效果来决定分数。国内大学可能不怎么以这种方式授课。 如果编译原理课程后面开训练营,可以这么搞。
2020-06-15