C++性能优化简单总结

什么样的代码是高度优化的?

 我们先出去数据结构和算法本身的使用。C++ 的高效代码通常是利用了各种编译器优化和语言特性来最大程度地提高执行效率和资源利用率的代码。我们需要编写编译器友好的代码来让编译器优化或者说编写出不用编译器高度优化优化也能达到同样效果的代码。pipeline, cache 是性能优化一个很重要的点  我们需要编写编译器友好优化型的代码更有利于提高效率但其实使用矢量化计算的代码编写难度是很高的,更像是在写汇编,如果不是做hpc的我们可以尽量让编译器来优化就足够了。还有就是用CUDA这种GPU编程可以很好加速并行计算 (现在还没学)
性能优化就不得不提一下测试框架  Google benchmark     gtest    doctest  
intel的vtune
Linux  perf工具
还有内存泄漏的工具 valgrind 当然他也有不仅限于内存泄漏检查的功能
  • 编译器一般都会进行经典的常量折叠 , 但一般不是万能的 ,如果你的代码过于复杂 就不会优化。
  • 经典的不变量提出循环体优化
  • xmm系列寄存器 浮点数优化的 矢量寄存器
  • simd 向量优化 avx see 指令集 这个得看兼容性 (开启O3的时候会有simd优化) memset底层就是simd
  • 可以使用 GCC -march=native -O3 让编译器自动检测当前硬件支持的指令集
  • 在进行指针操作的时候 可以 显示 表明 两个指针不会有重合 使用__restrict关键字 方便编译器优化
  • 使用voilatile 可以告诉 处理器取内容的时候必须是在内存里 而不是在寄存器里的
  • 可以使用openmp 他会强制进行并行计算 (基于 fork 和join 的并行计算框架)非常灵活 对代码的入侵性小。没有数据依赖的一些操作可以用openmp 实现并行。编译器集成了openmp 可以使用-fopenmp,只需要下载一些头文件。
  • constexpr可以进行 编译器求值 但constexpr不能保证一定在编译器求值 可以了解一下c++20 consteval
  • 内联优化 其实inline 这个关键词没什么用 在内联方面 ,而是放在在头文件里,可以在两个模块里存在,然后再一个地方初始化。可以理解为共具有 extern 和static的好处
  • 内联的化如果编译期 找不到他的实现体编译器是做不了内联的 如果想要内联 就尽量放在同一个文件里
  • 可以使用无锁数据结构 一般是用原子变量+内存序 来做的 开销比使用mutex低 因为mutex 底层就是cas 之类的硬件原语实现的
  • 有if分支的循环体是很难simd矢量化的 ,如果是跳跃访问的化矢量化也是很困难的甚至无法simd
  • if 还可能会影响分支预测 从而影响pipeline的工作影响效率, 有 unlikely 这样的提示编译器的
  • 字节对齐 更有利于优化
  • 结构体的SOA 和AOS SOA不符合面向对象编程 (OOP) 的习惯,但常常有利于性能。又称之为面向数据编程 (DOP) 更容易simd矢量化
  • 浮点优化的CPU周期是很长的,编译器不优化是因为可能÷0,编译器很葱末, 但是乘法很快我们可以变成乘法计算 但是可能精度损失,我们可以 -ffast-math让编译器大胆优化除法。
  • std的math是带重载的 如果用c语言的可能会有意想不到的BUG。
  • 除了经典的 map reduce 可以进行并行计算 ,分治一类的操作(没有数据依赖)我们也可以轻松进行并行,经典的就是快速排序,大数据的时候我们进行并行,当数据量小的时候 ,进行并行可能会有OS的开销,我们可以串行计算
  • 想要一个很好的并行结果,就必须要保证尽量不让cpu空转 ,cpu可以流水行,cache line也可以进行预取 ,可以更好的达到mem-bound
  • 写入内存的粒度很小可能会造成不必要的读取 ,intel _mm_stream_si32指令可以绕开缓存 得凑够一个cache line的时候再择机写回内存,这样可以充分利用硬件的特性,提高写入的效率和性能。当然只适用于纯写入,如果还要读的话反而还要同步等待stream执行完成。
  • 在进行IO密集型的任务时候 ,协程才是更好的方案
  • 一维数组比二维数组更高效
  • 多线程的伪共享,如果两个核心访问到了的同一缓存行,cpu为了安全起见 只允许一个核心 写入统一地址的缓存行,从而导致读写这个变量的速度受限于三级缓存的速度,而不是一级缓存的速度,要想消除错误共享很简单,只需要把每个核心写入的地址尽可能分散开了就行了。
  • jemalloc tcmalloc 这些对多线程 内存分配优化的库 因为他们都会有线程局部缓存,通过Hook技术替换
  • noexcept 会让函数不抛出异常 ,在减少二进制的同时,并且可以让编译器更可能的优化
  • 尽量避免拷贝 就像Spdlog 里 采用的都是 视图 我们只需要拿到弱引用 集date () size()
  • 尽量使用移动操作 std::move() 对简单数据类型没有用 ,注意c++返回值优化 不要返回std::move(tmp) 妨碍优化
  • alloctor 这样的内存池化技术来管理内存
  • 在网上看到了循环迭代器优于指针??? 其实开了编译优化以后 大家生成的汇编代码都是一样的
  • 尽量使用位运算 一般而言位运算都是高效的
  • 模板元编程 可以将数据尽量放到编译期计算 ,可以进行类型检查,避免了运行时的重复计算,提高了运行时效率。

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

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

相关文章

1 快速前端开发

1 前端开发 目的:开发一个平台(网站)- 前端开发:HTML、CSS、JavaScript- Web框架:接收请求并处理- MySQL数据库:存储数据地方快速上手:基于Flask Web框架让你快速搭建一个网站出来。1.快速开发…

HarmonyOS应用开发学习笔记 应用上下文Context 获取文件夹路径

1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器:定义组件重用样式 Extend装饰器:定义扩展组件样式 5、HarmonyOS 应用开发…

14-股票K线图功能-个股日K线SQL分析__ev

需求:统计个股日K线数据,也就是把某只股票每天的最高价,开盘价,收盘价,最低价形成K线图。

山西电力市场日前价格预测【2024-01-11】

日前价格预测 预测说明: 如上图所示,预测明日(2024-01-11)山西电力市场全天平均日前电价为231.43元/MWh。其中,最高日前电价为422.21元/MWh,预计出现在18:00。最低日前电价为0.00元/MWh,预计出…

现代软件测试中的自动化测试工具

自动化测试的重要性和优势 引言:随着软件开发的不断发展,自动化测试工具在现代软件测试中扮演着重要角色。提高效率:自动化测试可以加快测试流程,减少人工测试所需的时间和资源。提升准确性:自动化测试工具可以减少人…

二分图最大匹配算法:匈牙利、KM

文章目录 基础定义匹配二分图二分图的矩阵覆盖交错路与增广路匈牙利算法饱和X的匹配不管X、Y求最大匹配KM算法可行顶点标号、相等子图相等子图的若干性质KM算法的正确性基于以下定理:算法流程描述1描述2基础定义 匹配 匹配:给定一个无向图 G = < V , E > G=<V,E>…

基于云平台技术的车外视频隐私合规的浅谈

基于云平台技术的车外视频隐私合规创新旨在确保车外视频数据的合法、合规使用&#xff0c;同时保护个人隐私不受侵犯。以下是基于云平台技术的车外视频隐私合规的创新实践和考虑因素&#xff1a; 实践&#xff1a; 数据采集&#xff1a;对车外视频数据进行采集时&#xff0c;…

PACS医学影像报告管理系统源码带CT三维后处理技术

PACS从各种医学影像检查设备中获取、存储、处理影像数据&#xff0c;传输到体检信息系统中&#xff0c;生成图文并茂的体检报告&#xff0c;满足体检中心高水准、高效率影像处理的需要。 自主知识产权&#xff1a;拥有完整知识产权&#xff0c;能够同其他模块无缝对接 国际标准…

Linux CentOS 7.6安装JDK详细保姆级教程

一、检查系统是否自带jdk java --version 如果有的话&#xff0c;找到对应的文件删除 第一步&#xff1a;先查看Linux自带的JDK有几个&#xff0c;用命令&#xff1a; rpm -qa | grep -i java第二步:删除JDK&#xff0c;执行命令&#xff1a; rpm -qa | grep -i java | xarg…

ubuntu设置ssh登录,设置公钥无密登录

sudo apt-get install openssh-server vim sudo vim /etc/ssh/sshd_config 修改这几行 PubkeyAuthentication yes #指定公钥数据库文件 AuthorsizedKeysFile.ssh/authorized_keys #PasswordAuthentication yes 改为 PasswordAuthentication no 然后重启ssh服务 systemctl res…

企业的 Android 移动设备管理 (MDM) 解决方案

移动设备管理可帮助您在不影响最终用户体验的情况下&#xff0c;通过无线方式管理和保护组织的移动设备群&#xff0c;现代 MDM 解决方案还可以控制 App、内容和安全性&#xff0c;因此员工可以毫无顾虑地在托管设备上工作。移动设备管理软件可有效管理个人设备上的公司空间。M…

优化CentOS 7.6的HTTP隧道代理网络性能

在CentOS 7.6上&#xff0c;通过HTTP隧道代理优化网络性能是一项复杂且细致的任务。首先&#xff0c;我们要了解HTTP隧道代理的工作原理&#xff1a;通过建立一个安全的隧道&#xff0c;HTTP隧道代理允许用户绕过某些网络限制&#xff0c;提高数据传输的速度和安全性。然而&…

工业交换机在智慧水务和水处理中的应用

智慧水务是一种基于互联网和物联网技术的水务管理模式。它利用现代信息技术&#xff0c;将传统的水务管理模式升级&#xff0c;实现智慧化的水务管理方式。智慧水务的实现离不开各种先进的技术手段。物联网技术是智慧水务的重要组成部分。通过在水务系统中部署工业交换机、传感…

LLMs:Ghost Attention(GAtt)机制的简介(改进多轮对话+帮助注意力聚焦)、原理、作用之详细攻略

LLMs:Ghost Attention(GAtt)机制的简介(改进多轮对话+帮助注意力聚焦)、原理、作用之详细攻略 目录 来源

C/C++调用matlab

C/C调用matlab matlab虽然可以生成C/C的程序&#xff0c;但其能力很有限&#xff0c;很多操作无法生成C/C程序&#xff0c;比如函数求解、优化、拟合等。为了解决这个问题&#xff0c;可以采用matlab和C/C联合编程的方式进行。使用matlab将关键操作打包成dll环境&#xff0c;再…

MySQL 存储引擎全攻略:选择最适合你的数据库引擎

1. MySQL的支持的存储引擎有哪些 官方文档给出的有以下几种&#xff1a; 我们也可以通过SHOW ENGINES命令来查看&#xff1a; 还可以通过ENGINES表查看 2. 存储引擎比较 我们通过存储引擎表来看各自的优点&#xff1a; InnoDB 默认的存储引擎&#xff08;SUPPORT字段为D…

广东做“人工心脏”可以报销啦

&#xff08;人民日报健康客户端记者 杨林宋&#xff09;1月5日&#xff0c;据南方医科大学珠江医院消息&#xff0c;医院为一位57岁患者处于心衰终末期的患者&#xff0c;植入一款国产“人工心脏”——左心室辅助装置。据了解&#xff0c;这是该款“人工心脏”纳入广东省医保准…

py的循环语句(for和while)

前言&#xff1a;本章节和友友们探讨一下py的循环语句&#xff0c;主播觉得稍微有点难主要是太浑了&#xff0c;但是会尽量描述清楚&#xff0c;OK上车&#xff01;&#xff08;本章节有节目效果&#xff09; 目录 一.while循环的基本使用 1.1关于while循环 1.2举例 1.31-1…

[C#]使用winform部署PP-MattingV2人像分割onnx模型

【官方框架地址】 https://github.com/PaddlePaddle/PaddleSeg 【算法介绍】 PP-MattingV2是一种先进的图像和视频抠图算法&#xff0c;由百度公司基于PaddlePaddle深度学习框架开发。它旨在提供更精准和高效的图像分割功能&#xff0c;特别是在处理图像中的细微部分&#xf…

【Copilot使用】

Copilot是什么 copilot有多火&#xff0c;1月4日&#xff0c;科技巨头微软在官网上宣布将为Windows 11 PC推出Copilot键。 Copilot是微软在Windows 11中加入的AI助手&#xff0c;该AI助手是一个集成了在操作系统中的侧边栏工具&#xff0c;可以帮助用户完成各种任务。 Copilo…