C++性能优化—人工底稿版

devtools/2025/2/12 13:26:57/

C++以高性能著称,性能优化是C++程序员绕不过去的一个话题,性能优化是一个复杂、全局而又细节的问题,本文总结C++性能分析中常用的知识。

性能优化的时机

大部分关于性能优化的文章都强调:不要过早的进行性能优化

C++编码层面

数据结构和算法

选择最优的数据结构和算法是保证程序性能的基础。

为了极致的性能,有时候还需要根据实际业务定义自己的数据结构和算法。

避免不必要的复制

内联函数

常量表达式

使用 constexpr 使得表达式在编译时计算。

constexpr int square(int x) { return x * x; }int main() {int result = square(5); // 编译时计算return 0;
}

避免不必要的类型转换

避免频繁的类型转换,特别是尽量避免使用 dynamic_cast,尤其是在性能关键路径中。

class Base { public: virtual void doSomething() {} };
class Derived : public Base { public: void doSomething() override {} };int main() {Base* base = new Derived();Derived* derived = static_cast<Derived*>(base); // 使用 static_cast 避免动态类型转换derived->doSomething();delete base;return 0;
}

使用移动优化

……

硬件层面

内存管理

频繁的内存分配和释放导致性能下降,使用内存池来预分配一块大内存区域,避免多次分配和释放内存。

#include <vector>class MemoryPool {
public:
void* allocate(size_t size) {}void deallocate(void* ptr) {}private:
std::vector<void*> freeList;
};

优化常用操作

条件分支导致 CPU 分支预测失败,可以优化代码中条件分支的顺序,避免分支预测失败。

for (int i = 0; i < 1000; ++i) {if (i % 2 == 0) {// 一部分代码,高频的部分可以放在前面} else {// 另一部分代码}
}

编译器优化

充分相信编译器是聪明到了极致,而不是自作聪明的去揣测编译器

并性编程

多线程 并行执行任务,充分利用多核 CPU。

CPU缓存优化

数据访问顺序导致缓存未命中,影响性能,调整内存访问顺序,增加数据的局部性。如下为经典示例

const int SIZE = 10000;
int arr[SIZE][SIZE];// 访问顺序优化,按列访问时可能导致缓存未命中
for (int j = 0; j < SIZE; ++j) {for (int i = 0; i < SIZE; ++i) {arr[i][j] = i * j;}
}// 更好的访问顺序,按行访问
for (int i = 0; i < SIZE; ++i) {for (int j = 0; j < SIZE; ++j) {arr[i][j] = i * j;}
}

I/O 性能

性能分析工具

Visual Studio性能探测器

gprof 进行性能分析

VTune工具


http://www.ppmy.cn/devtools/157905.html

相关文章

kafka topic是什么?partition是什么? broker是什么?

在 Apache Kafka 中&#xff0c;理解 topic、partition 和 broker 是掌握其工作原理的基础。以下是对这些概念的详细解释&#xff1a; 1. Topic&#xff08;主题&#xff09; 定义&#xff1a;Topic 是 Kafka 中的基本消息类别或类别。它类似于数据库中的表&#xff0c;是消息…

Windows系统中常用的命令

随着Windows系统的不断改进&#xff0c;维护系统时有时候会因为新系统的更新而找不到对应的模块或者相关的信息入口&#xff0c;这个时候&#xff0c;记住一些命令就可以起到很好的帮助作用。 比如&#xff0c;windows11中的网络属性的修改&#xff0c;可能习惯了windows10或者…

保姆级教程Docker部署Zookeeper模式的Kafka镜像

目录 一、安装Docker及可视化工具 二、Docker部署Zookeeper 三、单节点部署 1、创建挂载目录 2、命令运行容器 3、Compose运行容器 4、查看运行状态 5、验证功能 四、部署可视化工具 1、创建挂载目录 2、Compose运行容器 3、查看运行状态 一、安装Docker及可视化工…

Java 2024年面试总结(持续更新)

目录 最近趁着金三银四面了五六家公司吧&#xff0c;也整理了一些问题供大家参考一下&#xff08;适合经验三年左右的&#xff09;。 面试问题&#xff08;答案是我自己总结的&#xff0c;不一定正确&#xff09;&#xff1a; 总结&#xff1a; 最近趁着金三银四面了五六家公…

JVM的性能优化

1.方法内联 方法内联,是指 JVM在运行时将调用次数达到一定阈值的方法调用替换为方法体本身 ,从而消除调用成本,并为接下来进一步的代码性能优化提供基础,是JVM的一个重要优化手段之一。 注: C++的inline属于编译后内联,但是java是运行时内联 简单通俗的讲就是把方法内部调…

Android 问题01_AGP_Kotlin_Compiler_Mapping

Android 问题01_AGP_Kotlin_Compiler_Mapping Android 从支持 Kotlin 开始&#xff0c;从 AGP 到需要同时分析 AGP 与 Kotlin Compiler 版本对应关系&#xff0c;因此多数较新的库都是 Kotlin 语言开发的。 下面讲的例子是对已经存在的项目作改造过程中发生的问题&#xff0c…

大型语言模型(LLM)中的自适应推理预算管理:基于约束策略优化的解决方案

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

springboot 事务管理

在Spring Boot中&#xff0c;事务管理是通过Spring框架的事务管理模块来实现的。Spring提供了声明式事务管理和编程式事务管理两种方式。通常&#xff0c;我们使用声明式事务管理&#xff0c;因为它更简洁且易于维护。 1. 声明式事务管理 声明式事务管理是通过注解来实现的。…