首页 > 其他分享 >编译优化学习

编译优化学习

时间:2024-04-14 20:13:37浏览次数:31  
标签:文件大小 CMAKE CXX 学习 编译 FLAGS 优化

转自:https://juejin.cn/post/6933180767656738824

1.介绍

代码 -> 词法语法分析 -> 语义分析 -> 中间代码生成 -> 目标代码生成
  • 编译器:中间代码生成。编译器会尝试对中间代码进行优化,通过减少无效或冗余的代码、计算强度优化等手段,以助于减少最终生成的指令数,或使用更高效的指令。编译器 为了提升代码最终的执行效率,会进行一个非常重要的步骤,就是编译优化
  • 指令集:基于中间代码生成机器可执行的目标代码,这个过程和操作系统、指令集、内存等相关。其中,不同的指令集也会带来不同的效率。

2.优化级别

在默认情况下,gcc 编译器不开启编译优化,因为编译器的目标是减少编译时间、保证编译结果能够按照期望进行测试。 (开启编译优化编译时长会增加,bin文件大小也会增加,但最终代码执行效率会增加) 

命令行执行开启编译优化:

g++ -O2 example.cpp -o example

cmake中开启编译优化:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2") #变量拼接

#设置debug和release
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0")
# -DNDEBUG 常用的一个宏,用来禁用标准库中的所有断言(assert)调用,进一步提高代码的运行效率。
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -O2 -DNDEBUG")
#需要在编译时置顶变量
cmake -DCMAKE_BUILD_TYPE=Debug/Release ..

不同编译优化级别编译时间、文件大小比较:

  • cmake -DCMAKE_BUILD_TYPE=Debug .. &&make -j12,编译优化级别O0,编译bin文件大小:723M,耗时8min 10s
  • cmake -DCMAKE_BUILD_TYPE=Release .. &&make -j12,编译优化级别O2 -DNDEBUG,编译bin文件大小:936M,耗时 11min 40s
  • cmake .. &&make -j12,编译优化级别O2,编译bin文件大小:946M,耗时 11min 58s

可见,编译优化等级越高,bin文件越大,编译耗时越长,执行效率会越高。

3.优化类型 

https://zhuanlan.zhihu.com/p/381490718,https://oi-wiki.org/lang/optimizations/

  • 常量传播
  • 常量折叠(替换)
  • 复写传播(替换)
  • 公共子表式消除
  • 无用代码消除。永远不能被执行到的代码或者没有任何意义的代码会被清除掉。
  • 方法内联。将比较简短的函数或者方法代码直接粘贴到其调用者中,以减少函数调用时的开销。
  • 循环旋转,循环不变量外提。
  • 循环展开。因为直接赋值的效率是最高的。for循环还有条件判断,循环条件变化这些。
  • 自动尾递归改写。

开编译优化也有副作用。

标签:文件大小,CMAKE,CXX,学习,编译,FLAGS,优化
From: https://www.cnblogs.com/BlueBlueSea/p/18134596

相关文章

  • Causal Inference理论学习篇-Tree Based-Causal Tree
    Tree-BasedAlgorithmsTree-based这类方法,和之前meta-learning类的方法最明显的区别是:这类方法把causaleffect的计算显示的加入了到了树模型节点分裂的标准中从response时代过渡到了effect时代。大量的这类算法基本围绕着树节点分裂方式做文章,普遍采用的是兼容性比较高......
  • [深度学习]L2正则化和权重衰退(Weight Decay)
    L2正则化和权重衰退(WeightDecay)一、权重衰退介绍1.什么是权重衰减/权重衰退——weight_decayL2正则化主要作用是:解决过拟合,在损失函数中加入L2正则化项2.L2范数L2范数,也被称作欧几里得范数或者Frobenius范数(当应用于矩阵时),是最常用的向量范数之一,用于衡量向量元......
  • jy验证码协议加密分析学习记录
    目录流程参考免责声明:分析请求与加密参数register请求获取challenge和gt第一次W值分析第二次提交W分析第二次W明文值分析第三个W值分析验证小坑流程参考免责声明:本文章主要用于技术交流学习,作者不承担任何滥用技术所产生的法律责任。如有侵权,请联系作者删除!分析请求与加......
  • windows 使用MSVC2022编译 Qt 5.12.11
    准备准备一下安装程序,并添加到PATH环境变量。Perl选择64位Portable:PerlPortableRuby选择64位版本进行安装:ruby64bitPython安装Pythonjomnmake不支持并行编译,使用jom进行并行编译。下载jom,解压并添加到PATH环境变量。jomQt5.12.11编译下载地址:Qt5.12.11。使用MS......
  • 为什么我这么推崇体验式学习?
    有很多人问我怎么才能学会编程,需要报班吗?如何自学?为什么我看书看完就忘了?甚至开始怀疑自己,我是不是不适合学编程,女生适合当程序员吗?说实话,看到这么多不得其道的同学,我也很犯难,我不是搞教育的,但我深知外面的培训班也没有谈论教育的资格,我只能从我自身学会编程的经验出发,论证我接下......
  • 实验一 学习App
    一、实验题目:原型设计二、实验目的:掌握产品原型设计方法和相应工具使用。三、实验要求(1)对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点(至少3条)。对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点(至少三条)墨刀、Axure和Mockplu......
  • 解决编译redis报错zmalloc.h:50:10: fatal error: jemalloc/jemalloc.h: No such file
    编译redis时报错:zmalloc.h:50:10:fatalerror:jemalloc/jemalloc.h:Nosuchfileordirectory,执行:#sudomakeMALLOC=libc1即可成功 需要先运行“makedistclean”,它设置删除所有早期的编译文件,然后运行“make”,这样就得到了redis服务器程序的新编译。执行后成功编......
  • 企业如何根据业务需求实时调整网络资源,实现资源的动态分配和优化?
    云联网以其“一点上云,多云互联”的特性,为中国联通提供了极大的便利。通过云联网,企业可以轻松地将其业务部署到云端,实现资源的快速调配和共享。同时,云联网支持多云环境的互联互通,使得企业能够灵活地选择不同云服务商,构建多元化的云生态,从而满足其多样化的业务需求。广泛覆盖和互联......
  • 网站推荐【UUID资料库】一款一款面向 <考研考试考证、学习资源下载、优质文章分享> 的
    网站推荐【UUID资料库】一款一款面向<考研考试考证、学习资源下载、优质文章分享>的资料库资源库使用介绍1、官方网址UUID资料库https://www.uu2id.com/ UUID资料库-考研公共课https://www.uu2id.com/tongkaoUUID资料库-考研专业课https://www.uu2id.com/schooldefine考......
  • STL学习
    栈:stack容器内元素的访问​由于栈(stack)本身就是一种后进先出的数据结构。在STL中stack中只能通过top()来访问栈顶元素栈上的基本操作栈的基本操作包括:函数名用途push(x)将x入栈top()获得栈顶元素pop()用以弹出栈顶元素empty()可以检测stack内是否为......