IE盒子

搜索
查看: 119|回复: 13

C++性能优化白皮书

[复制链接]

1

主题

6

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-12-7 15:05:49 | 显示全部楼层 |阅读模式
最近看完了《C++性能白皮书》,这本书列出了一些性能优化的思路,不过只是一些指引,没有讲具体细节,我整理出了其中的关键点分享:
(我只有纸质书,电子版的我也没有,大家也别找我要了!!!)
硬件篇
作为一个程序员,想要性能优化,最好要了解些硬件,特别是CPU架构的一些知识点:

  • 流水线
  • 分支预测
  • 寄存器重命名
  • 数据预取
  • 指令重排和乱序执行
  • 同时多线程(超线程)
  • 数据并行 SIMD 单指令多数据

还要了解CPU的特点:

  • 一个处理器上,多条指令可能同时执行
  • 一个处理器上,代码的执行结果会和程序员可观察到的顺序一致,但其他处理器观察到的执行结果可能不是一个顺序
  • 顺序、无跳转的代码性能最高
  • 相邻且对齐的数据访问性能最高

内存方向的优化:

  • 金字塔图需要了解


还需要了解CPU多级缓存和关键跨度的概念,这块可以看这篇文章:https://mp.weixin.qq.com/s/iKWQZxn6XYKU9KnlBRynfg
要了解基本工具:

  • 编译器:MSVC GCC clang
  • 不同级别的优化:O1 O2 O3 以及他们的主要区别
需要知道性能分析指导下的优化:PGO profile-guided optimization
也就是利用程序运行的profiling数据,指导编译器进一步优化。多测试,找到程序热点,根据数据针对性优化。
还有链接期优化:link-time optimization LTO
LTO可以:

  • 跨翻译单元的函数内联
  • 跨翻译单元的程序整体优化
  • 死代码消除
做性能优化,需要了解性能测试的阿姆达尔定律,80-20原则,20%的代码决定了80%的结果,如果对20%以外的代码进行优化,性价比太低,性能测试的意义就在于此:

  • 找出代码中性能开销最大的部分
  • 测量代码优化之后的实际收益
需要熟练使用性能采样工具:

  • Windows中Visual Studio有自带的性能分析工具
  • Linux有Perf或者gperftools
C++篇
关于C++语言层面的优化,可以在下面这些方向做优化:

  • 优先栈内存,次之堆内存
  • 巧妙使用RAII管理资源
  • 移动语义虽然不好理解,但也可以巧妙使用移动语义减少对象的非必要拷贝
  • 模板和泛型技巧华而不实,给开发标准库的人使用还好,而且调试难度也较高,我们普通业务开发者只需要做到能看懂即可(个人见解)
  • 异常是可以考虑使用的,可以看看ISO C++网站和C++ 核心指南62,异常会导致程序的二进制体积有膨胀(5%-15%),异常不能代替所有的错误码,因为异常catch会使得程序性能下降。作者认为:使用异常对于大部分C++项目仍然适用,不使用异常的麻烦大于好处,除非真因为二进制文件和实时性方面的原因需要禁用异常。
  • 字符串默认类型时 const char[],传参时会退化成const char*,创建全局字符串最好使用const char[]
  • 标准库容器的方法至少提供了基本异常安全保证:要了解强异常安全保证和无异常保证。
  • vector的移动构造函数标记为noexcept才会使用移动构造,移动构造函数需要标记为noexcept,如果没有标记,代码性能可能会有较大的负面影响。
  • shared_ptr构造优先使用make_shared
10.了解function,function用作回调很方便,支持类型擦除,它还有个好处,可以用来存储带状态的函数对象,不像C语言那样需要个void*存储状态。但需要了解它的开销,貌似48个字节是个坎。
11.堆内存管理:可以了解下jemalloc mimalloc tcmalloc12.输入输出流可以考虑使用ios_base::sync_with_stdio(false)关闭同步,性能会提升,也最好使用\n取代endl,免得频繁刷新缓冲区。可考虑使用fmt
13.并发

  • 需要了解内存序的概念
  • 一些优质的多生产者多消费者并发队列
  • moodycamed::ConcurrentQueue
  • atomic_queue
  • Folly中MPMCQueue
  • 标准库也有些并行策略:
  • execution::seq 序列执行,不可并行
  • par:可并行化
  • par_unseq:可并行化 向量化
  • unseq:可向量化
通用方法篇
通用优化方法

  • 优化原则:不要执行不必要的代码
  • 循环优化,尽量减少临时对象的创建
  • 结构体设计时最好做到对齐
  • 尽量顺序访问数据,矩阵乘法可以很好的印证CPU Cache的作用,再考虑添加-O3 -march=native开启SIMD自动向量化
  • 缓存争用问题
  • 多看看别人的代码,别人的优化,多用优秀的开源代码
更多C++的文章大家可以看看这个
回复

使用道具 举报

2

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-12-7 15:06:08 | 显示全部楼层
性能优化我只看intel官方手册[吃瓜]
回复

使用道具 举报

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-12-7 15:06:14 | 显示全部楼层
很专业[赞][赞][赞]
回复

使用道具 举报

0

主题

5

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-12-7 15:06:31 | 显示全部楼层
vector移动函数那个有代码的例子吗?
回复

使用道具 举报

0

主题

5

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-12-7 15:07:10 | 显示全部楼层
比如呢
回复

使用道具 举报

1

主题

11

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-12-7 15:07:56 | 显示全部楼层
哪里有叫c++性能白皮书 的? 是英文的?
回复

使用道具 举报

2

主题

12

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2022-12-7 15:08:40 | 显示全部楼层
中文的,参加一个大会送的
回复

使用道具 举报

4

主题

10

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2022-12-7 15:09:35 | 显示全部楼层
这个你随便一搜应该就能搜到
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-12-7 15:09:46 | 显示全部楼层
amd有没有什么值得一看的资料?
回复

使用道具 举报

1

主题

5

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2022-12-7 15:10:00 | 显示全部楼层
《c++性能白皮书》是什么东西?Google 结果只有5条
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表