C++性能白皮书

news2024/11/24 3:23:15

最近看完了《C++性能白皮书》,这本书列出了一些性能优化的思路,不过只是一些指引,没有讲具体细节,我整理出了其中的关键点分享给大家:

硬件篇

作为一个程序员,想要性能优化,最好要了解些硬件,特别是CPU架构的一些知识点:

  • 流水线

  • 分支预测

  • 寄存器重命名

  • 数据预取

  • 指令重排和乱序执行

  • 同时多线程(超线程)

  • 数据并行 SIMD 单指令多数据

还要了解CPU的特点:

  • 一个处理器上,多条指令可能同时执行

  • 一个处理器上,代码的执行结果会和程序员可观察到的顺序一致,但其他处理器观察到的执行结果可能不是一个顺序

  • 顺序、无跳转的代码性能最高

  • 相邻且对齐的数据访问性能最高

内存方向的优化:

 

要了解基本工具:

  • 编译器: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++语言层面的优化,可以在下面这些方向做优化:

  1. 优先栈内存,次之堆内存

  2. 巧妙使用RAII管理资源

  3. 移动语义虽然不好理解,但也可以巧妙使用移动语义减少对象的非必要拷贝

  4. 模板和泛型技巧华而不实,给开发标准库的人使用还好,而且调试难度也较高,我们普通业务开发者只需要做到能看懂即可(个人见解)

  5. 异常是可以考虑使用的,可以看看ISO C++网站和C++ 核心指南62,异常会导致程序的二进制体积有膨胀(5%-15%),异常不能代替所有的错误码,因为异常catch会使得程序性能下降。作者认为:使用异常对于大部分C++项目仍然适用,不使用异常的麻烦大于好处,除非真因为二进制文件和实时性方面的原因需要禁用异常。

  6. 字符串默认类型时 const char[],传参时会退化成const char*,创建全局字符串最好使用const char[]

  7. 标准库容器的方法至少提供了基本异常安全保证:要了解强异常安全保证和无异常保证。

  8. vector的移动构造函数标记为noexcept才会使用移动构造,移动构造函数需要标记为noexcept,如果没有标记,代码性能可能会有较大的负面影响。

  9. shared_ptr构造优先使用make_shared

10.了解function,function用作回调很方便,支持类型擦除,它还有个好处,可以用来存储带状态的函数对象,不像C语言那样需要个void*存储状态。但需要了解它的开销,貌似48个字节是个坎。

11.堆内存管理:可以了解下jemalloc mimalloc tcmalloc

12.输入输出流可以考虑使用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自动向量化

  • 缓存争用问题

  • 多看看别人的代码,别人的优化,多用优秀的开源代码


获取更多资源关注公众号;奇牛编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于JavaScript使用window.onload的解释说明

文章目录window.onload简介为什么使用window.onload()绑定有名的函数绑定执行多个函数window.onload 与 jQuery ready() 区别window.onload简介 window.onload() 方法用于在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻执行某个方法。 …

苹果手机怎么拦截垃圾短信,亲测有效的方法,图文教学

​当小伙伴的苹果手机频繁收到垃圾短信时,不仅会影响正常的日常生活,还有可能泄露个人信息,给小伙伴带来不必要的麻烦。苹果手机怎么拦截垃圾短信?本文小编将介绍苹果手机拦截垃圾短信的实用技巧,帮助你轻松应对垃圾短…

PPT怎么做都丑?试试这个自动化工具吧,酷炫报表的救星!

昨晚在网上冲浪的时候,看到某位字节员工在脉脉上发帖:31岁,被PPT弄丢了工作,理由是PPT做得太丑,配不上公司形象,建议人力评估,安排离职沟通。 其实看到这时,我并没有多大得感触。因…

Ceres的自动求导实现原理剖析

目录数学原理实现原理总结首先注意数值求导和自动求导在使用的时候的不同之处。 实际上,正是自动求导这个地方使用了类模板,导致它不仅可以传入参数,还可以传入Jet类型的数据,从而实现了参数的雅可比矩阵的计算,完成自…

centos7 搭建ELK(elasticsearch、logstash、kibana)

1、下载安装包 使用华为镜像站下载速度很快,华为镜像站:https://mirrors.huaweicloud.com/home,下载时需要保证版本一致 2、安装elasticsearch 解压到当前目录 [rootlocalhost elk]# tar zxvf elasticsearch-7.4.2-linux-x86_64.tar.gz 安…

RFID盘点软件为企业提供RFID固定资产管理方案

随着科技的发展,固定资产管理系统也经过了一些变革,从刚开始的单机版逐渐发展成SaaS版本,物联网版本等。从刚开始只支持条形码到支持二维码、RFID码。RFID固定资产管理系统上线后,通过给每个实物资产绑定一个RFID码标签后&#xf…

2022-06-16_555时基的迷人历史和先天缺陷!

https://www.eet-china.com/news/magazine220608.html 555时基的迷人历史和先天缺陷! 发布于2022-06-16 03:39:12 LARRY STABILE 流行数十年的555时基,业内不知晓的工程师应该寥寥无几!几乎所有的数字电路教材中,都有该芯片的身影…

华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】

使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12201821.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 分糖果 小明从糖果…

第六章.卷积神经网络(CNN)—CNN的实现(搭建手写数字识别的CNN)

第六章.卷积神经网络(CNN) 6.2 CNN的实现(搭建手写数字识别的CNN) 1.网络构成 2.代码实现 import pickle import matplotlib.pyplot as plt import numpy as np import sys, ossys.path.append(os.pardir)from dataset.mnist import load_mnist from collections import Order…

实时数仓Hologres新一代弹性计算组实例技术揭秘

作者:王奇(花名慧青) 阿里云Hologres研发 随着实时数仓在业务生产系统的普及,资源弹性、资源隔离等保障业务稳定性方面的技术需求开始变得越来越迫切。Hologres在保障业务方面持续优化核心技术竞争力,过去一年中&…

Facebook广告投放的正确姿势:玩转目标定位

如果你正在投放 Facebook广告,那么你一定有过这样的经历:明明设置了目标受众,但是广告却没有带来转化。在这方面,你可能忽略了一个很重要的因素——目标定位。想要打造高质量、高曝光率的 Facebook广告,如何才能成功实…

「TCG 规范解读」第7章 TPM工作组 TPM 总结

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…

90%的人都理解错了HTTP中GET与POST的区别

Get和Post是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别就是Get把参数包含在URL中,Post通过request body传递参数。 你可能自己写过无数个Get和Post请求,或者已经看过很多权威网站总结…

数据分析-2.必会的六大实用模型

对于刚刚接触数据分析的人来说,经常会有这样的困惑和疑问:数据分析究竟难不难?难的话难在哪?为什么有时候作分析不知道从何下手,只能眉毛胡子一把抓? 其实就连我这种已经在数据分析行业浸淫十几年的老油条…

JavaSE学习day9 集合(基础班结束)

1.ArrayList 集合和数组的优势对比: 长度可变 添加数据的时候不需要考虑索引,默认将数据添加到末尾 不能存基本数据类型。只能通过包装。 1.1ArrayList类概述 什么是集合 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变 Ar…

shell脚本中那些关于时间的处理方案,你都掌握了吗?

文章目录前言一. linux中关于时间的命令有哪些?1.1 命令一: hwclock命令二:date的那些事二. 时间命令在脚本中的应用2.1 用date命令实现统计执行时间的脚本2.2 time命令3. sleep命令总结前言 大家好,我是互联网老辛,专注云原生领…

[Css]Grid属性简单陈列(适合开发时有基础的快速过一眼)

[css进阶]Grid属性简介 文章目录[css进阶]Grid属性简介典型需求网格容器的属性displaygrid-template-columns和grid-template-rowsgrid-template-areasgrid-templategrid-column-gap grid-row-gapgrid-gapjustify-itemsalign-itemsjustify-contentalign-contentgrid-auto-colum…

【面试题】ES6 如何将 Set 转化为数组

大厂面试题分享 面试题库后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库Set 是 ES6 中新增的一种集合类型,类似于数组,但其成员的值是唯一的,即不会重复。关于Set,可以阅…

Leaf说明

什么是Leafleaf是叶子的意思我们使用的Leaf是美团公司开源的一个分布式序列号(id)生成系统我们可以在Github网站上下载项目直接使用为什么需要Leaf上面的图片中是一个实际开发中常见的读写分离的数据库部署格式专门进行数据更新(写)的有两个数据库节点它们同时新增数据可能产生…

ThinkPHP5篮球培训报名系统

有需要请私信或看评论链接哦 可远程调试 ThinkPHP5篮球培训报名系统一 介绍 此篮球培训报名系统基于ThinkPHP5框架开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。用户可注册登录,充值,报名,反馈信息等&…