![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++性能优化-笔记
文章平均质量分 71
chauneyWang
专注学习,专注进阶,专注自己
展开
-
C++性能优化:系统体系结构相关性
前言这一章主要的内容和C++编程可能是没有什么关系,主要是硬件的一些问题。内存层次对于性能的讨论最终都会落在内存以及使用内存上面。算法的复杂性主要取决于使用的内存的大小和类型,我们现在所面临的问题就是计算很快速但是访问很慢。在一般的计算机内存层次中有五个层级:寄存器、L1(芯片内缓存)、L2(芯片外缓存)、主存(以各种变体出现的随机访问器:DRAM、SDRAM、RAMBUS、SyncLink等)和磁盘存储器。现在大多数的硬盘都是两个内存组成,一个小而快、一个大而慢。内存访问的趋势是依赖访问时间和原创 2022-03-28 23:25:58 · 1200 阅读 · 0 评论 -
C++性能优化:代码优化
代码优化本章主要讲的是比较广泛的一些编程中遇到的降低性能的操作,并且改正的方法。比如说我们会遇到冗余计算的问题。在一次循环中,每次都需要计算一个值,这样可以将这个值的计算放到循环外面;再比如需要在两个不同的函数中调用同一个函数,结果相同。这样的话我们可以静第一次调用得到的结果用参数传递给另一个函数,而不需要在另一个函数中再执行一遍。(代码)缓存其实这一点讲的和上面的有些类似。在循环中有些可以确定的结果可以先写到循环外面,把结果缓存到局部变量,然后在循环中直接读取局部变量的值。预先计算预先计算和原创 2022-03-27 16:22:37 · 2256 阅读 · 0 评论 -
c++性能优化:引用计数
引用计数和自然界一样,玻尔兹曼熵法同样适用于代码世界。小型的软件在面对的用户不断增加的新功能就会需要不断迭代。这样的迭代就会带来代码的混乱,评断代码的混乱标准是衰变率。与混乱的软件有关的主要难题就是代码的内存讹误,也就是会发生代码的内存泄漏,指针的过早删除等等。但是在c++中使用一种机制来尽可能的避免使用指针带来的以上问题,它就是引用计数。引用计数的基本思想就是将指针的控制从客户放到对象本身,当没有对象使用这个指针的时候就把这个指针删除。引用计数有时还会被说成是一种性能优化,我们来看一下一个对象在复制原创 2022-03-27 16:09:42 · 1447 阅读 · 0 评论 -
c++性能优化:标准模板库
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2022-03-27 10:52:59 · 717 阅读 · 0 评论 -
c++性能优化:内联技巧
条件内联 编译,配置,调试等与内敛有关的消极因素会将内联的时间点尽量后移,一般都是大部分调试完之后才会考虑内联部分。理想情况是内联关系在配置的结果上的,而且大多数的编译器也可以使用编译开关来阻止内联,但有些编译器不支持的话那只能使用条件编译的方式来控制内联。 但一个隐患是配置如果修改需要频繁的在服务于性能的内联和服务于测试的外联,但我们可以使用预处理的方式避免问题的产生。 以下就是条件编译的例子 ![条件编译](https://img-blog.csdnimg.cn/99b0163c86294886原创 2022-01-10 08:41:40 · 411 阅读 · 0 评论 -
c++性能优化:内联性能方面的考虑
调用间优化我们之前讨论的内联主要是防止函数调用产生的开销,现在还有一种调用间优化,这个优化叫调用间优化。调用间的优化是代码级的,这是建立在一种更加广泛的上下文关系上。原创 2021-10-25 08:29:40 · 224 阅读 · 0 评论 -
C++性能优化:可伸缩性
可伸缩性提高C++代码性能的几种方法主要有缩短代码执行路径、添加处理器、升级处理器的速度。但是往往添加处理器也很难就是达到好的效果,有很多原因会导致添加的处理器数量和速度提升的倍数不成线性关系,比如单个处理器变为双处理器,但是执行速度就不一定会快2倍。单处理器的体系结构中,主要是包含处理器、主存以及快速缓存。但多线程执行时主要通过抢占式的线程调度方式,看起来是并发,实际是cpu在轮流执行这几个线程。SMP体系结构SMP体系结构中有多个同样的cpu,多个线程可以同时执行。线程在没有特殊写明的情况下不会原创 2022-03-03 23:17:58 · 244 阅读 · 0 评论 -
c++性能优化:内联基础
前言从这一章开始我们就跳开设计的界限,开始着眼于性能。这就意味着,接下来的设计可能会为了追求极致的性能放弃一些设计。什么是内联方法调用代价为何使用内联内联详述内联虚方法通过内联获得性能总结...原创 2021-10-20 08:46:49 · 247 阅读 · 0 评论 -
c++性能优化:多线程内存池
前言上一章,我们的视线全部都放在单线程的内存池,这一节主要讲的是多线程的内存池。由于多线程的问题,需要讲内存分配和释放的合适地方加上互斥锁,这样才能保证线程访问资源的安全。实现通过模板的实现,可以带入任意类型的锁,这样的话就可以使得内存池的应用更加灵活。template<class POOLTYPE, class LOCK>class MTMemoryPool{public: inline void* alloc(size_t size); inline void.原创 2021-10-14 23:17:37 · 962 阅读 · 0 评论 -
c++性能优化:单线程内存池
前言本章主要讲的是单线程内存池的构建。我们都知道,内存频繁的分配和释放会导致程序性能的降低,主要的原因是内存管理上的消耗,以及有些应用程序会在使用的过程中以某种特殊的方式使用内存,导致会出现不需要内存的地方出现性能的损失。我们可以通过自己定义内存管理的方式达到管理内存的目的,防止程序对于内存的滥用。内存管理器的设计是多维的,主要考虑两个方面,第一个是内存的大小固定还是可变,第二个是单线程还是多线程。本章讨论的管理器主要是单线程方面的。版本0 new()和delete()从原理上说,默认的内存管理器是通原创 2021-09-21 16:15:15 · 340 阅读 · 0 评论 -
c++性能优化:临时对象
前言对于性能来说,实际上许多的问题都需要和出现的频率以及本身执行一次的开销挂钩,有些问题虽然看似比较开销较大,但是很少会执行到,那么也不会对程序有着非常大的影响;同样的一个很小的开销的函数执行很频繁,同样会对程序的执行效率有很大的影响。这一章中作者主要是根据临时对象来阐述这样一个观点。对象定义先看下文章中提到的例子:class Rational{friend Rational operator + (const Rotional& a, const Rotional& b.原创 2021-09-12 15:10:51 · 151 阅读 · 0 评论 -
c++性能优化:返回值优化
返回值优化前言这一章主要讲的是返回值优化,这个优化通常会交给编译器实现,用于加快源代码执行,通过对源代码进行转化并消除对象实现的。按返回值构造以下的例子主要是complex实现复数的类:插入代码这个类的操作符函数,比如加法的函数如下:代码以上可以看出,加法的结果是返回值返回的。实际上编译器内部会进行操作a=b+c这样的结果,a会被编译器临时构造出来,b和c都是引用传递,因此两个参数的函数会被临时创建为三个参数。同样的调用的时候也会发生变化,需要传递三个参数,这个就是返回值优化的步骤之一。原创 2021-09-06 08:23:05 · 433 阅读 · 0 评论 -
c++性能优化-虚函数
虚函数目录虚函数前言一、虚函数的构造二、模版和继承1.引入库2.读入数据总结前言性能优化的目的是为了让程序变得高效,但同时也不能丧失程序的可维护性和可扩展性。本章总结主要是关于虚函数方面的性能优化的要点一、虚函数的构造 虚函数想必大家都比较了解。虚函数的引入为c++提供了多态性,为实现面向对象编程奠定了基础。但是仔细分析一下,虚函数的额引入必然也会带来一些开销。比如,虚函数实现的一个重要的指针vptr,正是这个指针使得父类能够正确的找到子类继承的函数;其次,我们必须先得到指向函数表的指针原创 2021-08-29 14:18:26 · 872 阅读 · 0 评论 -
c++性能优化-构造函数和析构函数
构造函数和析构函数目录构造函数和析构函数前言一、继承二、合成三、缓式构造四、冗余构造总结前言 正常的情况来说,构造函数和析构函数应该是消耗性能比较少的地方,我们在学习基础的c++编程的时候,书上基本都会写构造函数和析构函数需要尽量的简洁,不能承担复杂的计算工作或者是逻辑工作。事实也确实如此,如果将大量的计算放到构造函数和析构函数,整个类都会比较臃肿,其他类引用时也会有更多的不方便。所以,构造函数和析构函数大多数的情况下主要是负责的初始化和清除资源的操作。一、继承 继承和合成都是在对象设计原创 2021-07-25 16:03:24 · 595 阅读 · 0 评论 -
c++性能优化笔记-跟踪实现下的性能隐患
跟踪实现下的性能隐患我们在调试代码的时候,会有很多不同的手段。像我的话最常使用的是打日志Log,通过Log可以很清晰的判断出代码的逻辑,再进一步的深入查找问题出现的根源。其实还有很多其他的方法,比如墓碑文件,看Trace等等。实现记录日志以及记录代码执行相关的Trace是我们整个项目组成不可或缺的一部分,有的时候往往Log打得好,问题查得更快,整个项目也会更加的健壮。但是,我们在项目中往往会忽视这些Trace代码带来的性能消耗。由于工作中的项目,几十万甚至几百万的代码量,程序员的Log为了形成统一的风原创 2021-07-04 21:39:19 · 157 阅读 · 0 评论