当前位置: 首页 > news >正文

gcc 中-O1 -O2 -O3 优化的原理

       一般来说,如果不指定优化标识的话,gcc就会产生可调试代码,每条指令之间将是独立的:可以在指令之间设置断点,使用gdb中的 p命令查看变量的值,改变变量的值等。并且把获取最快的编译速度作为它的目标。

       当优化标识被启用之后,gcc编译器将会试图改变程序的结构(当然会在保证变换之后的程序与源程序语义等价的前提之下),以满足某些目标,如:代码大小最小或运行速度更快(只不过通常来说,这两个目标是矛盾的,二者不可兼得)。

       在不同的gcc配置和目标平台下,同一个标识所采用的优化种类也是不一样的,这可以使用-Q --help =optimizers来获取每个优化标识所启用的优化选项。

下面每个-f**优化标识都可以在上述链接中找到解释


1.-O,-O1:
       这两个命令的效果是一样的,目的都是在不影响编译速度的前提下,尽量采用一些优化算法降低代码大小和可执行代码的运行速度。并开启如下的优化选项:

-fauto-inc-dec

-fbranch-count-reg

-fcombine-stack-adjustments

-fcompare-elim

-fcprop-registers

-fdce

-fdefer-pop

-fdelayed-branch

-fdse

-fforward-propagate

-fguess-branch-probability

-fif-conversion2

-fif-conversion

-finline-functions-called-once

-fipa-pure-const

-fipa-profile

-fipa-reference

-fmerge-constants

-fmove-loop-invariants

-freorder-blocks

-fshrink-wrap

-fshrink-wrap-separate

-fsplit-wide-types

-fssa-backprop

-fssa-phiopt

-fstore-merging

-ftree-bit-ccp

-ftree-ccp

-ftree-ch

-ftree-coalesce-vars

-ftree-copy-prop

-ftree-dce

-ftree-dominator-opts

-ftree-dse

-ftree-forwprop

-ftree-fre

-ftree-phiprop

-ftree-sink

-ftree-slsr

-ftree-sra

-ftree-pta

-ftree-ter

-funit-at-a-time

 

2. -O2
       该优化选项会牺牲部分编译速度除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以提高目标代码的运行速度

-fthread-jumps

-falign-functions  -falign-jumps

-falign-loops  -falign-labels

-fcaller-saves

-fcrossjumping

-fcse-follow-jumps  -fcse-skip-blocks

-fdelete-null-pointer-checks

-fdevirtualize -fdevirtualize-speculatively

-fexpensive-optimizations

-fgcse  -fgcse-lm 

-fhoist-adjacent-loads

-finline-small-functions

-findirect-inlining

-fipa-cp

-fipa-cp-alignment

-fipa-bit-cp

-fipa-sra

-fipa-icf

-fisolate-erroneous-paths-dereference

-flra-remat

-foptimize-sibling-calls

-foptimize-strlen

-fpartial-inlining

-fpeephole2

-freorder-blocks-algorithm=stc

-freorder-blocks-and-partition -freorder-functions

-frerun-cse-after-loop 

-fsched-interblock  -fsched-spec

-fschedule-insns  -fschedule-insns2

-fstrict-aliasing -fstrict-overflow

-ftree-builtin-call-dce

-ftree-switch-conversion -ftree-tail-merge

-fcode-hoisting

-ftree-pre

-ftree-vrp

-fipa-ra

3. -O3
       该选项除了执行-O2所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代CPU中的流水线,Cache等

-finline-functions      // 采用一些启发式算法对函数进行内联

-funswitch-loops        // 执行循环unswitch变换

-fpredictive-commoning  //

-fgcse-after-reload     //执行全局的共同子表达式消除

-ftree-loop-vectorize   //

-ftree-loop-distribute-patterns

-fsplit-paths

-ftree-slp-vectorize

-fvect-cost-model

-ftree-partial-pre

-fpeel-loops

-fipa-cp-clone options

这个选项会提高执行代码的大小,当然会降低目标代码的执行时间。

4. -Os
       这个优化标识和-O3有异曲同工之妙,当然两者的目标不一样,-O3的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度,但是这个选项是在-O2的基础之上,尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。
为了降低目标代码大小,会禁用下列优化选项,一般就是压缩内存中的对齐空白(alignment padding)

-falign-functions 

-falign-jumps 

-falign-loops

-falign-labels

-freorder-blocks 

-freorder-blocks-algorithm=stc

-freorder-blocks-and-partition 

-fprefetch-loop-arrays

5. -Ofast:
      该选项将不会严格遵循语言标准,除了启用所有的-O3优化选项之外,也会针对某些语言启用部分优化。如:-ffast-math ,对于Fortran语言,还会启用下列选项:

-fno-protect-parens

-fstack-arrays

6.-Og:
      该标识会精心挑选部分与-g选项不冲突的优化选项,当然就能提供合理的优化水平,同时产生较好的可调试信息和对语言标准的遵循程度。

相关文章:

  • 人工智能实践:Tensorflow笔记(一):人工智能概述
  • Python相关知识
  • 人工智能实践:Tensorflow笔记(二):TensorFlow框架
  • HTTPS 与 SSL
  • Windows的口令文件SAM
  • Windows组策略
  • Windows启动文件夹与设置开机自启动脚本/软件开机自启
  • Windows任务计划程序
  • WSH和FSO
  • Windows修改注册表实现开机自启动
  • ActiveX
  • 操作系统市场份额
  • desktop.ini和folder.htt
  • 人工智能实践:Tensorflow笔记(三):神经网络优化
  • Python网络爬虫与信息提取(一)(Wing Canopy)
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • git 常用命令
  • js 实现textarea输入字数提示
  • Odoo domain写法及运用
  • python docx文档转html页面
  • Swoft 源码剖析 - 代码自动更新机制
  • 从零搭建Koa2 Server
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 读懂package.json -- 依赖管理
  • 解决iview多表头动态更改列元素发生的错误
  • 解析带emoji和链接的聊天系统消息
  • 聊一聊前端的监控
  • 前端临床手札——文件上传
  • 突破自己的技术思维
  • 学习笔记:对象,原型和继承(1)
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • $GOPATH/go.mod exists but should not goland
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (java)关于Thread的挂起和恢复
  • (独孤九剑)--文件系统
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (一)Neo4j下载安装以及初次使用
  • (一)认识微服务
  • (转载)虚函数剖析
  • .net 7 上传文件踩坑
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net6使用Sejil可视化日志
  • .Net中间语言BeforeFieldInit
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @Data注解的作用
  • @RequestBody与@ModelAttribute
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [20150707]外部表与rowid.txt
  • [AutoSar NVM] 存储架构
  • [C++]18:set和map的使用
  • [CISCN 2023 初赛]go_session
  • [Deep Learning] 神经网络基础