优化范围分为哪几类?优化目标原理分别是什么?
可以分为本地优化,全局优化,过程间优化
- 本地优化是_**针对基本快进行的(针对顺序的执行顺序)优化。
- 全局优化基于控制流图cfg
全局优化因为可以拿到多个基本快中的信息,因此会进行*函数整体上的优化,不仅限于顺序执行。 *比如寄存器的图染色算法就用到了这个cfg
- 过程间优化:过程间优化基于的是 多个函数间进行优化的关系。
可以看到这三个范围越来越大:一个函数里面的一个基本快,一个函数里的多个基本快,多个函数
常见的本地优化场景有哪些,原理和做法是什么?
常见的本地优化场景
- 代数优化:将不必要的代数计算去除
- 常数折叠:如果结果是一个常亮常数,那么会将他的计算过程删除转换为常数
- 删除不可达无用基本快:有些基本快分支一直不会运行,删除
- 公共子表达式删除:对于同一个表达式的变量,可以直接使用结果删除不必要的重复计算
- 删除无用变量和无用表达式(这里的无用表达式指的和上面不一样,这里特殊指代无用变量的表达式)
原理和做法是什么
基本概念解释: 见上面:专业术语概念解释
- 可用表达式分析:基于控制流图cfg和数据流图。
删除不可达基本快和子表达式还有常熟折叠,代数优化的原理 是顺序遍历程序指令。
将之前计算过得表达式在后面分析是否还有重复的;
不可达基本快也是根据前面的指令分析永远走不到这个基本快中(比如一直true或者false);
常熟折叠也是分析同样的表达式如果前面计算过就用前面的值。
做法就是顺序遍历指令(如一图的子表达式删除和拷贝传播技术)
- 活跃性分析:删除无用变量和无用变量的计算表达式的原理是利用变量的活跃度分析进行检测。
如果一个变量在之后的表达式中没有用到那么就是没用的死变量死代码,这种代码存在没有意义因为没有人用它。
因此做法就是倒序遍历,如果这个变量在之前的表达式中出现过那么就意味着用到了这个变量就是活的,反之如果没有出现就是死的需要删除。
我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!