• 编译原理学习笔记(十二)代码优化


    代码优化

    以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记。

    概述

    .1. 目的:提高目标代码运行效率。时间效率(减少运行时间);空间效率(减少内存容量)。

    原则:进行优化必须严格遵循“不能改变原有程序语义”原则。

    2. 优化的分类

    从优化的层次,与机器是否有关,分为:独立于机器的优化、与机器有关的优化。

    从优化涉及的范围,又分为:局部优化、循环优化、全局优化。

    3. 满足以下三个条件的程序段,称为基本块:

    • 只有一个入口和一个出口,且语句为顺序执行的程序段。
    • 它使得所有转向该基本块的入口都是该基本块的第一条语句。
    • 如果块中任一语句被执行,则该块内的所有语句也将被执行(无分支),且执行次数一样(无循环)。

    基本块划分问题

    (1)确定入口语句

    • 语句序列第一句为入口语句;
    • 任何可以由条件/无条件跳转而转移到的第一条语句为入口语句;
    • 紧跟在跳转语句之后的第一条语句为入口语句;

    (2)每个入口语句直到下一个入口语句或程序结束,之间的语句属于同一个基本快。

    优化基本方法

    1. 利用代数性质(代数变换)

    • 编译时完成常数表达式的计算,如a:=5+6+x变成a:=11+x。
    • 数组下标引用时,下标偏移可在编译时预先做好。
    • 运算强度减弱,如x*8变成x<<3。

    2. 复写(copy)传播:如 x:=y 这样的赋值语句,二者值相同,有些情况可以用y代替x编译。其实就是将多语句简化,减少值的传播过程。

    3. 删除公共达式:具有相同值的子表达式在两个以上地方出现时,称它为公共子表达式。可以将之删除至一次,将多次计算变为一次。

    4. 删除冗余代码:冗余代码就是毫无实际意义的代码,又称死代码 (deadcode)或无用代码(useless code)。永远不会执行的代码。

    5. 循环优化

    • 循环不变式的代码外提:提取出循环过程中不随循环控制变量改变的表达式至循环之外,从而减少计算次数,也称频度削弱。
    • 循环展开:将循环展开减少执行语句数量,以空间换时间。
    • 归纳变量的优化和条件判断的替换
    • 其他循环优化方法:把多重嵌套的循环变成单层循环;把 n 个相同形式的循环合成一个循环等。

    6. in_line展开:把过程(或函数)调用改为in_line展开可节省许多处理过程(函数)调用所花费的开销。省去了函数调用时参数压栈,保存返回地址等指令。这也仅仅限于简单的函数。

    7. 其他方法,如控制流方法。

    引用说明

    - 邵老师课堂PDF
    - 《编译原理级编译程序构造》
  • 相关阅读:
    jquery做的图片挂起的效果
    Android数据存储之DOM解析XML文件(输出部分)
    Android数据存储之JSON数据解析(输出部分)
    Android网络编程之Web Service获取天气预报( 获取省市填充下拉列表)
    Android数据存储之DOM解析XML文件(读取部分)
    Android网络编程之一个Android登录系统模块的实现(服务器端)
    Android数据存储之XmlPull解析XML文件(读取部分)
    Android数据存储之XmlPull解析XML文件(输出部分)
    Android数据存储之JSON数据解析(读取部分)
    Android网络编程之一个Android登录系统模块的实现(客户端)
  • 原文地址:https://www.cnblogs.com/AlvinZH/p/8314569.html
Copyright © 2020-2023  润新知