C++性能白皮书
最近看完了《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++语言层面的优化,可以在下面这些方向做优化:
-
优先栈内存,次之堆内存
-
巧妙使用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 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自动向量化
-
缓存争用问题
-
多看看别人的代码,别人的优化,多用优秀的开源代码
获取更多资源关注公众号;奇牛编程
相关文章:

C++性能白皮书
最近看完了《C性能白皮书》,这本书列出了一些性能优化的思路,不过只是一些指引,没有讲具体细节,我整理出了其中的关键点分享给大家: 硬件篇 作为一个程序员,想要性能优化,最好要了解些硬件&…...
华为OD机试 - 黑板上色 | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...

如何在六秒内吸引观众的注意力
根据《2022国民专注力洞察报告》显示,当代人的连续专注时长,已经从2000年的12秒,下降到了现在的8秒。对于这个事实你可能难以相信,实际上这意味着,大多数互联网用户跳到一些页面上时,可能眼皮都不眨一下就离…...

FreeRTOS与UCOSIII任务状态对比
FreeRTOS任务状态 1、运行态 正在运行的任务,正在使用处理器的任务。 单核处理器中任何时候都有且只有一个任务处于运行态。 2、就绪态 已经准备就绪(非阻塞或挂起),可以立即运行但还没有运行的任务。 正在等待比自己高优先级…...

小程序 npm sill idealTree buildDeps 安装一直没反应
目录 一、问题 二、解决 1、删除.npmsrc 、清除缓存 2、更换镜像源 3、最终检测 一、问题 记录:今天npm 一直安装不成功 显示:sill idealTree buildDeps 我的版本: 我百度到换镜像源安装方法,但我尝试后,依然…...

GPT系列详解:初代GPT
本文详细解读了OpenAI公司在2018年6月发布的论文《Improving Language Understanding by Generative Pre-Training》,它其中介绍的算法也就是后来人们说的GPT。本文借鉴了李沐的这个视频,感兴趣的同学可以移步观看大神的讲解。 目录引言GPT方法无监督预训…...
为什么要使用数据库
数据保存在内存优点:存取速度快缺点:数据不能永久保存数据保存在文件优点:数据永久保存缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便数据保存在数据库1)数据永久保存2&a…...

【单目标优化算法】海鸥优化算法(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

筑基六层 —— 整型提升及实用调式技巧
目录 一.修炼必备 二. 整型提升 三.实用调式技巧 一.修炼必备 1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 2.趁手武器:印象笔记/有道云笔记 3.修炼秘籍&…...
后端前端文件传输2中传出模式
base64文件传输 app.route(/download, methods[get]) def hello_as(): # 数据 id request.args.get("id") cur g.db.cursor() cur.execute(fselect name,grade,commentNum,cityName,sceneryThemeName from dataList where cityId? , (id,)) …...

【ZOJ 1067】Color Me Less 题解(vector+开方)
问题 颜色缩减是从一组离散颜色到较小颜色的映射。这个问题的解决方案需要在标准的24位RGB颜色空间中执行这样的映射。输入由十六个RGB颜色值的目标集合和要映射到目标集合中最接近的颜色的任意RGB颜色集合组成。为了我们的目的,RGB颜色被定义为有序三元组ÿ…...

凌恩生物经典文章:孟德尔诞辰200周年,Nature Genetics礼献豌豆高质量精细图谱
本期为大家分享的文章是2022年发表在《Nature Genetics》上的一篇文章“Improved pea reference genome and pan-genome highlight genomic features and evolutionary characteristics”,作者通过结合三代pacbio测序、染色体构象捕获(Hi-C)测…...

进程间通信(二)/共享内存
⭐前言:在前面的博文中分析了什么的进程间通信和进程间通信的方式之一:管道(匿名管道和命名管道)。接下来分析第二种方式:共享内存。 要实现进程间通信,其前提是让不同进程之间看到同一份资源。所谓共享内存…...

电路模型和电路定律——“电路分析”
各位CSDN的uu们你们好呀,今天小雅兰的内容是我这学期的专业课噢,首先就学习了电路模型和电路定律,包括电路和电路模型、电流和电压的参考方向、电功率和能量、电路元件、电阻元件、电压源和电流源、基尔霍夫定律。那么现在,就让我…...

软件工程 | 第一章:软件工程学概述
软件工程学概述一、前言二、软件危机1.典型表现2.产生原因3.消除危机途径三、软件工程1.概述2.软件本质特征3.软件工程基本原理4.软件工程方法学1️⃣传统方法学2️⃣面向对象方法学四、软件生命周期五、结语一、前言 本文将讲述软件工程导论的第一章相关知识点,主…...
前端开发页面HEAD作用
文档类型 为每个 HTML 页面的第一行添加标准模式(standard mode)的声明, 这样能够确保在每个浏览器中拥有一致的表现。 <!DOCTYPE html> 语言属性 为什么使用 lang="zh-cmn-Hans" 而不是我们通常写的 lang="zh-CN" 呢? 请参考知乎上的讨论: …...
CSS开发技巧——行为技巧
CSS开发技巧——行为技巧 使用overflow-scrolling支持弹性滚动 iOS页面非body元素的滚动操作会非常卡(Android不会出现此情况),通过overflow-scrolling:touch调用Safari原生滚动来支持弹性滚动,增加页面滚动的流畅度 场景:iOS页面滚动 使用t…...

PX4之代码结构
PX4开源飞控是目前主流的开源飞控项目,被很多公司作为飞控开发的参考。也广泛被用于现在流行的evtol验证机的飞控,进行初步的飞行验证。可能大多数AAM以及UAM都离不开PX4。 项目代码可以从github下载 $ git clone --recursive GitHub - PX4/PX4-Autopil…...

【C++11】可变参数模板(函数模板、类模板)
在C11之前,类模板和函数模板只能含有固定数量的模板参数。C11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模…...
centos安装高版本cmake
之前centos版本为cmake version 2.8.12.2采用yum remove卸载后重装还是这个版本,看来centos下面就是这个最新了,这说明centos煞笔。于是自己下载cmake包,然后安装。 官方cmake链接地址(3.16)(其他版本自己找,链接给你了) 1,wget下载 2,解压: tar -zxf cmake-3.16.0.…...

嵌入式开发STM32 -- 江协科技笔记
1.背景介绍及基础认知 8大输入输出 斯密特触发器:高于设定阈值输出高电平,低于设定阈值输出低电平 有关上拉输入、下拉输入、推挽输出、开漏输出、复用开漏输出、复用推挽输出以及浮空输入、模拟输入的区别 1、上拉输入:上拉就是把电位拉高…...

历年武汉大学计算机保研上机真题
2025武汉大学计算机保研上机真题 2024武汉大学计算机保研上机真题 2023武汉大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 分段函数计算 题目描述 写程序计算如下分段函数: 当 x > 0 x > 0 x>0 时, f ( x ) …...

汽配快车道:助力汽车零部件行业的产业重构与数字化出海
汽配快车道:助力汽车零部件行业的数字化升级与出海解决方案。 在当今快速发展的汽车零部件市场中,随着消费者对汽车性能、安全和舒适性的要求不断提高,汽车刹车助力系统作为汽车安全的关键部件之一,其市场需求也在持续增长。汽车…...
ansible template 文件中如果包含{{}} 等非ansible 变量处理
在 Ansible 模板中,如果你的 Python 脚本里有大量 {}、f""、或者其他 Jinja 会误解析的语法,就需要用 {% raw %}…{% endraw %} 把它们包起来,只在需要替换变量的那一行单独“放行”。例如: {% raw %} #!/usr/bin/env …...
UniApp 生产批次管理模块技术文档
UniApp 生产批次管理模块技术文档 1. 运行卡入站页面 (RunCardIn) 1.1 页面结构 <template><!-- 页面容器 --><view class"runCardIn" :style"{ paddingTop: padding }"><!-- 页头组件 --><pageHeader :title"$t(MENU:…...

显示docker桌面,vnc远程连接docker
目录 相关概念: 实现步骤: 1.启动docker容器 2.安装x11 3.Docker 容器中安装一个完整的图形桌面(XFCE)和 VNC 远程桌面服务器(TightVNC) 4.配置vncservice 5.本地安装VNC Viewer连接VNC Viewer下载地…...

【芯片设计中的跨时钟域信号处理:攻克亚稳态的终极指南】
在当今芯片设计中,多时钟域已成为常态。从手机SoC到航天级FPGA,不同功能模块运行在各自的时钟频率下,时钟域间的信号交互如同“语言不通”的对话,稍有不慎就会引发亚稳态、数据丢失等问题。这些隐患轻则导致功能异常,重…...

UE5蓝图中播放背景音乐和使用代码播放声音
UE5蓝图中播放背景音乐 1.创建背景音乐Cube 2.勾选looping 循环播放背景音乐 3.在关卡蓝图中 Event BeginPlay-PlaySound2D Sound选择自己创建的Bgm_Cube 蓝图播放声音方法二: 使用代码播放声音方法一 .h文件中 头文件引用 #include "Kismet/GameplayS…...

RabbitMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 选型指南(一)
一、引言 ** 在当今分布式系统大行其道的技术时代,消息队列作为分布式系统的关键组件,起着举足轻重的作用。它就像是一个可靠的信使,在不同的系统模块、服务之间传递信息,让各个部分能够高效、稳定地协同工作。消息队列能够实现系…...
在 WSL Ubuntu-24.04 上安装 Nacos 2.5.1 并使用 MySQL 数据库
在微服务架构中,Nacos 是一个非常重要的服务发现和配置管理工具。本文将详细介绍如何在 WSL(Windows Subsystem for Linux)中的 Ubuntu-24.04 系统上安装 Nacos 2.5.1,并将其配置为使用 MySQL 数据库进行数据存储。我们将使用 roo…...