首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

GNU汇编总结 11

GNU汇编总结 11

2, 编译器优化级别2
   
    结合了第一个级别的所有优化技术, 再加上一下一些优化:
   
    -fforce-mem: 这种优化再任何指令使用变量前, 强制把存放再内存位置中的所有变量都复制到寄存器
   
    中。 对于只涉及单一指令的变量, 这样也许不会有很大的优化效果。 但是对于再很多指令(必须数学操作)
   
    中都涉及到的变量来说, 这会时很显着的优化, 因为和访问内存中的值相比 ,处理器访问寄存器中的值要
   
    快的多。
   
    -foptimize-sibling-calls: 这种技术处理相关的和/或者递归的函数调用。 通常, 递归的函数调用
   
    可以被展开为一系列一般的指令, 而不是使用分支。 这样处理器的指令缓存能够加载展开的指令并且
   
    处理他们, 和指令保持为需要分支操作的单独函数调用相比, 这样更快。
   
    -fstrength-reduce: 这种优化技术对循环执行优化并且删除迭代变量。 迭代变量是捆绑到循环计数器
   
    的变量, 比如使用变量, 然后使用循环计数器变量执行数学操作的for-next循环。
   
    -fgcse: 这种技术对生成的所有汇编语言代码执行全局通用表达式消除历程。 这些优化操作试图分析
   
    生成的汇编语言代码并且结合通用片段, 消除冗余的代码段。如果代码使用计算性的goto, gcc指令推荐
   
    使用-fno-gcse选项。
   
    -fcse-follow-jumps: 这种特别的通用子表达式消除技术扫描跳转指令, 查找程序中通过任何其他途径都不
   
    会到达的目标代码。 这种情况最常见的例子就式if-then-else语句的else部分。
   
    -frerun-cse-after-loop: 这种技术在对任何循环已经进行过优化之后重新运行通用子表达式消除例程。
   
    这样确保在展开循环代码之后更进一步地优化还编代码。
   
    -fdelete-null-pointer-checks: 这种优化技术扫描生成的汇编语言代码, 查找检查空指针的代码。 编译
   
    器假设间接引用空指针将停止程序。 如果在间接引用之后检查指针, 它就不可能为空。
   
    -fextensive-optimizations: 这种技术执行从编译时的角度来说代价高昂的各种优化技术,但是它可能
   
    对运行时的性能产生负面影响。
   
    -fregmove: 编译器试图重新分配mov指令中使用的寄存器, 并且将其作为其他指令操作数, 以便最大化
   
    捆绑的寄存器的数量。
   
    -fschedule-insns: 编译器将试图重新安排指令, 以便消除等待数据的处理器。 对于在进行浮点运算时有
   
    延迟的处理器来说, 这使处理器在等待浮点结果时可以加载其他指令。
   
    -fsched-interblock: 这种技术使编译器能够跨越指令块调度指令。 这可以非常灵活地移动指令以便等待
   
    期间完成的工作最大化。
   
    -fcaller-saves: 这个选项指示编译器对函数调用保存和恢复寄存器, 使函数能够访问寄存器值, 而且不必
   
    保存和恢复他们。 如果调用多个函数, 这样能够节省时间, 因为只进行一次寄存器的保存和恢复操作, 而
   
    不是在每个函数调用中都进行。
   
    -fpeephole2: 这个选项允许进行任何计算机特定的观察孔优化。
   
    -freorder-blocks: 这种优化技术允许重新安排指令块以便改进分支操作和代码局部性。
   
    -fstrict-aliasing: 这种技术强制实行高级语言的严格变量规则。 对于c和c++程序来说, 它确保不在数据
   
    类型之间共享变量。 例如, 整数变量不和单精度浮点变量使用相同的内存位置。
   
    -funit-at-a-time: 这种优化技术指示编译器在运行优化例程之前读取整个汇编语言代码。 这使编译器可以
   
    重新安排不消耗大量时间的代码以便优化指令缓存。 但是, 这会在编译时花费相当多的内存, 对于小型计算机可能
   
    是一个问题。
   
    -falign-functions: 这个选项用于使函数对准内存中特定边界的开始位置。 大多数处理器按照页面读取内存,
   
    并且确保全部函数代码位于单一内存页面内, 就不需要叫化代码所需的页面。
   
    -fcrossjumping: 这是对跨越跳转的转换代码处理, 以便组合分散在程序各处的相同代码。 这样可以减少
   
    代码的长度, 但是也许不会对程序性能有直接影响。
   
    3, 编译器优化级别3
   
    它整合了第一和第二级别中的左右优化技巧, 还包括一下优化:
   
    -finline-functions: 这种优化技术不为函数创建单独的汇编语言代码, 而是把函数代码包含在调度程序的
   
    代码中。 对于多次被调用的函数来说, 为每次函数调用复制函数代码。 虽然这样对于减少代码长度不利, 但是
   
    通过最充分的利用指令缓存代码, 而不是在每次函数调用时进行分支操作, 可以提高性能。
   
    -fweb: 构建用于保存变量的伪寄存器网络。 伪寄存器包含数据, 就像他们是寄存器一样, 但是可以使用各种
   
    其他优化技术进行优化, 比如cse和loop优化技术。
   
    -fgcse-after-reload: 这中技术在完全重新加载生成的且优化后的汇编语言代码之后执行第二次gcse优化,
   
    帮助消除不同优化方式创建的任何冗余段。
返回列表