当前位置: 首页 > article >正文

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

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.kler.cn/a/542322.html

相关文章:

  • Spring常用注解和组件
  • 尝试一下,交互式的三维计算python库,py3d
  • 练习题(2.10)
  • 《LeetCode Hot100》 Day01
  • 企业级Mysql实战
  • 【C++】命名空间
  • Ubuntu 下 nginx-1.24.0 源码分析 ngx_tm_t 类型
  • Node.js怎么调用到打包的python文件呢
  • 支持高并发的 Web 应用系统架构中LVS和keepalived是什么?
  • RabbitMQ 如何设置限流?
  • 安卓基础(Intent)
  • 运用 LangChain 编排任务处理流水线,实现多轮对话场景
  • 【C语言标准库函数】标准输入输出函数详解[4]:二进制文件读写函数
  • 通用的将jar制作成docker镜像sh脚本
  • 机器学习 - 数据的特征表示
  • 《Transformer架构完全解析:从零开始读懂深度学习的革命性模型》
  • 【C++指南】解锁C++ STL:从入门到进阶的技术之旅
  • LabVIEW 开发航天项目软件
  • SSM开发(十一) mybatis关联关系多表查询(嵌套查询,举例说明)
  • unity碰撞的监测和监听
  • SpringBoot 项目中使用Log4j2详细(避坑)
  • 在Uniapp中使用阿里云OSS插件实现文件上传
  • 高级java每日一道面试题-2025年02月03日-服务器篇[Nginx篇]-Nginx是如何处理一个HTTP请求的呢 ?
  • 【leetcode】滑动窗口刷题总结
  • Python 爬虫基础教程
  • 物联网水质监测系统设计与实现/基于STM32的水产养殖云监控系统设计