导图社区 C++ 性能优化
C++ 性能优化的方法,详细概述了C++程序中优化性能的各种策略、技术、工具和方法。并行化技术:使用TBB(Threading Building Blocks)或OpenMP指令来实现多线程计算。TBB主要针对C++,而OpenMP则支持多种语言。使用硬件特性:利用SIMD(单指令多数据)指令集,如SSE或AVX,进行向量化操作,以加速数据处理。确保编译器和硬件平台支持向量化操作。
华为鸿蒙系统详解。Harmony OS NEXT是基于LonOS去除Android(AOSP)后形成的全新手机操作系统。该系统集成了Linux内核和LiteOS作为其底层内核系统。在编译和构建方面,它使用定制版本的Clang编译器作为前端,LLVM作为后端,针对目标架构arm-linux-ohos进行优化。为了支持嵌入式环境,系统采用了uclibc作为小型的C语言标准库,并且也支持musl-libc,这是一个轻量级且高效的C标准库实现,常用于嵌入式系统和一些主流的Linux发行版,如AlpineLinux和Gentoo。
Valgrind 工具集分析,这个工具集对于开发人员来说是非常有用的,因为它可以帮助发现程序中的内存问题、性能瓶颈等。
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
C++性能优化
监控
指标
memory
IO
子主题
CPU
QPS/TPS/IOPS/OPS
首响、吞吐量
内存开销
峰值&稳定值
响应时间
CPU 占用
使用top 命令观测cpu的使用情况
工具
perf
目标
追求可容忍延迟(Latency)下的最大吞吐(Throughput)。
实现功能的最小内存开销
分析
确定最耗时的函数
确定
优化
编译优化
并行编译make -j
编译优化选项-O2或-O3
针对目标架构进行特定优化
其他的优化指令
-pg 生成gprof分析所需要的性能分析信息
-ffast-math:改变数学函数的行为以提高速度,这可能会牺牲精度和正确性
-funroll-loops:尝试将小循环“展开”,以减少循环开销。
-ftree-vectorize:尝试自动向量化计算,以利用SIMD指令
-flto 或 -fwhole-program:启用链接时优化(LTO),这可以在整个程序范围内进行优化
循环优化
循环展开以减少循环的次数
向量化
方法:利用SIMD(单指令多数据)指令集,如SSE或AVX
使用IPP库,IPP的全称是IntelIntegrated Performance Primitives
使用编译器的自动向量化支持
virtual studio
-ftree-vectorize
windows 和linux 下支持向量化编译的方式
直接使用汇编函数
linux 下查看当前支持的SMID 指令集
查GCC :gcc -c -Q -march=native --help=target
查CPU :cat /proc/cpuinfo
要求:需要支持向量化操作的编译器和硬件平台。
避免不必要的计算
与循环变量无关的计算移动到循环外部
预取数据
如果循环中的计算涉及到跨多个数组元素的读取操作,可以使用预取技术来提前加载数据到缓存中,以避免缓存未命中导致的性能损失
并行化技术
OpenMP 指令
多线程计算
Threading Building Blocks (TBB)
对比
TBB只能针对C++, 如果程序基于C或者Fortran就用不上了
如果并行模式主要用于内建类型的有界循环(bounded loop),最好采用 OpenMP
TBB需要相当可观的重新设计程序,而OpenMP足够简单
OpenMP需要编译器支持,TBB需要下载运行库
使用适当的数据结构
使用连续内存布局的结构体或数组
使用局部变量
将频繁使用的全局变量或对象存储在局部变量中,提高缓存命中以减少访问时间
算法和数据结构优化
缓存优化
提高缓存命中
内存管理
避免频繁的分配和释放内存
使用引用和指针(智能指针)
内存池技术
内存访问通常比CPU计算更耗时,因此需要减少对内存的访问
使用寄存器变量或将常用数据存储在本地变量中,以减少内存访问。
内存对齐,提高数据访问的速度
多线程&并发
openMP
解决多线程锁的竞争
使用高效的库和工具
硬件加速
CUDA
OPENCL