当前位置: 首页 > 科技观察

十万字初稿,C++优化系列来了!

时间:2023-03-16 17:12:57 科技观察

本文转载自微信公众号《程序喵大师》,作者程序喵大师。转载本文请联系程序大师喵公众号。大家好,我是程序喵。不知不觉又是周一了,你还在床上吗?看到这条推文,如果你已经up了,请在评论区扣1,让程序喵喵看看有多少人和我一样用心!最近在C++技术交流群里找了很多高手。欢迎大家加入喵哥微信,进群讨论电脑知识!我将在不久的将来发布一系列C++优化文章。可能是过年的缘故,我发现最近阅读量明显下降了,所以硬核系列文章会在明年更新。本文将一一介绍给大家的胃口。我们平时写工程程序的时候,除了功能可用性之外,性能也是最重要的考虑因素。编写具有可用功能的代码很容易,但我们往往很难不去实现某个功能。难点始终是在满足性能要求的同时保证功能可用。一般公司对程序的大小和运行速度都有严格的要求。有时,因为几个字节的代码段大小或几十毫秒的运行时间,导致整个项目无法达到验收标准,导致无法成功上线。说了这么多只是为了强调性能优化的重要性。如何做好优化,才能体现一个C++程序员的真实水平。关于性能优化,我们需要了解三个概念:1.性能指标一定要衡量,而不是猜测:我做过一段时间的SDK开发,每次发布一个SDK,都必须包含SDK的使用文档和性能指标。测试报告,性能测试报告包含非常详细的指标测试数据。当然,这个数据是自己猜不出来的,必须要进行测试。2.帕累托定律帕累托定律,又称28定律,80%的执行时间花在了大约20%的代码上,80%的内存被大约20%的代码使用,80%的维护成本花费在20%的代码上。以上代码的百分比。我们在做程序优化的时候也是如此。大多数情况下,也许我们只需要找到那20%的代码,深度优化一下,就可以基本满足性能要求了。3.阿姆达尔定律SPRING阿姆达尔定律:有一个公式,其中:St表示优化后整体性能提升的比例,P表示优化部分的运行时间占总运行时间的比例,Sp表示优化部分比例的性能改进。例如:1、程序运行100s,其中90s调用函数func,func优化后性能提升30%,即P=90/100=0.9,Sp=1+30%=1.3,则程序整体效率为St=1/((1-0.9)+0.9/1.3)=1.26214,程序整体性能提升26%。2、程序运行100s,其中10s调用函数func,优化后func性能提升80%,即P=10/100=0.1,Sp=1+80%=1.8,则程序整体效率为St=1/((1-0.1)+0.1/1.8)=1.04651,程序整体性能提升了4%。这个定律实际上间接验证了帕累托定律的正确性,让我们优化那些关键部分。说完性能优化的原理,再说说我的优化系列方案。目前的优化计划大致分为以下几个主题:1.度量分析主题:比如用什么函数来度量一个函数的耗时,用什么代码分析工具来动态和静态分析代码。例如:2.Codingstandard题目:分析C++中各种操作的效率,包括不同类型变量的存储效率,智能指针、循环、函数参数、虚函数、数组等的使用效率,以及如何更好地使用它们进行代码优化。例如每个操作占用的时钟周期:3.编译优化专题:各种编译器性能分析,了解常见的编译优化选项,分析编译器如何优化代码,做了哪些优化,编译器优化了哪些障碍(whatitit做不到),如何充分利用编译器的优化选项。例如介绍优化编译器的优化级别:O0(默认选项):不优化,方便函数调试Og:方便调试的优化选项(比O1更保守)O1:保守优化选项,40多个优化选项Os:产生更小代码大小的优化选项(比O2更保守)O2:常用的release优化选项,在O1的基础上,额外开放了40多个优化选项,包括自动内联等规则O3:更激进的优化选项(对错误编码的最低容忍度),在O2的基础上,开放了十多个优化选项。Ofast:开启可能不符合IEEE浮点数等标准的性能优化选项。图:4.内存优化专题:内存使用往往是影响程序性能的关键因素。本主题将介绍如何有效使用缓存,如何操作缓存,优化内存访问速度,如何使用更少的内存,以及如何防止内存抖动,内存对齐等。5.多线程优化主题:如何使全CPU的使用,如何同步线程,如何使用锁,使用什么锁,理解和调试上下文切换,如何让关键线程运行更高效等。6.乱序执行话题:理解CPU的乱序执行策略,以及如何利用这一特性编写高效的代码。7.向量计算专题:了解CPU的向量计算及各种指令集、寄存器、内置函数,提高数据计算效率。8.特殊的优化编码技巧:这里会介绍很多高效的编码技巧,如何降低分支预测率,如何优化低效的除法运算,如何更好地进行数据边界检查,介绍一些高效的数学函数库等等。9、模板元编程编码技巧:如何利用模板编程优化程序运行效率。10.大杂烩:其他实用技巧。介绍就到这里,给大家推荐一个好用的网址链接。第一个是:https://godbolt.org/点击查看高清图片如图,输入C++代码,右半边会显示编译器编译好的代码,通过看在高级语言背后的汇编指令中,我们可以更好地分析代码的性能。该网站更强大的功能是支持市面上几乎所有的编译器,并且有各种版本。如果我们看汇编代码有困难,可以去这个网站:https://cppinsights.io/如图,网站右半边会显示编译器眼中的代码,这对我们分析程序也很有帮助。