C++性能优化:提升代码执行效率的艺术

C++性能优化:提升代码执行效率的艺术

C++性能优化:提升代码执行效率的艺术

在这里插入图片描述

一、学习目标与重点

本章将深入探讨C++性能优化的核心知识,帮助你掌握提升代码执行效率的艺术。通过学习,你将能够:

  1. 理解性能优化的基本概念,掌握性能分析的方法
  2. 学会优化内存管理,减少内存泄漏和内存碎片
  3. 理解CPU优化技巧,提高代码的执行速度
  4. 学会优化I/O操作,提升文件和网络读写的效率
  5. 培养性能优化思维,设计高效的代码

二、性能优化的基本概念

2.1 性能优化的原则

性能优化应该遵循以下原则:

  • 先测量后优化:在优化之前,必须先测量代码的性能,找出瓶颈所在
  • 优化瓶颈:只优化对性能影响最大的部分
  • 保持代码的可维护性:优化后的代码应该易于理解和维护
  • 测试优化结果:优化后必须测试代码的正确性和性能提升效果

2.2 性能分析工具

常用的性能分析工具包括:

  • GProf:GNU的性能分析工具
  • Valgrind:内存调试和性能分析工具
  • Perf:Linux下的性能分析工具
  • Visual Studio Profiler:Windows下的性能分析工具

三、内存管理优化

3.1 内存泄漏的检测与修复

#include<iostream>#include<memory>// 使用智能指针避免内存泄漏classMyClass{public:MyClass(){ std::cout <<"MyClass 构造函数"<< std::endl;}~MyClass(){ std::cout <<"MyClass 析构函数"<< std::endl;}voiddoSomething(){ std::cout <<"MyClass 正在做某事"<< std::endl;}};// 使用智能指针voiduseSmartPointer(){ std::shared_ptr<MyClass> ptr = std::make_shared<MyClass>(); ptr->doSomething();// 智能指针会自动释放内存,不需要手动调用delete}// 手动管理内存(可能导致内存泄漏)voiduseManualMemory(){ MyClass* ptr =newMyClass(); ptr->doSomething();// 忘记调用delete,导致内存泄漏}intmain(){ std::cout <<"=== 内存管理优化示例 ==="<< std::endl; std::cout <<"使用智能指针:"<< std::endl;useSmartPointer(); std::cout << std::endl; std::cout <<"手动管理内存:"<< std::endl;useManualMemory();return0;}

3.2 内存碎片的优化

#include<iostream>#include<vector>// 预分配内存避免内存碎片voidpreallocateMemory(){constint size =10000; std::vector<int> vec; vec.reserve(size);// 预分配内存for(int i =0; i < size;++i){ vec.push_back(i);}}// 不预分配内存(可能导致内存碎片)voidnotPreallocateMemory(){constint size =10000; std::vector<int> vec;for(int i =0; i < size;++i){ vec.push_back(i);}}intmain(){ std::cout <<"=== 内存碎片优化示例 ==="<< std::endl;// 测量预分配内存和不预分配内存的性能auto start = std::chrono::high_resolution_clock::now();preallocateMemory();auto end = std::chrono::high_resolution_clock::now();auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); std::cout <<"预分配内存耗时: "<< duration <<"微秒"<< std::endl; start = std::chrono::high_resolution_clock::now();notPreallocateMemory(); end = std::chrono::high_resolution_clock::now(); duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); std::cout <<"不预分配内存耗时: "<< duration <<"微秒"<< std::endl;return0;}

四、CPU优化技巧

4.1 循环优化

#include<iostream>#include<vector>#include<algorithm>// 优化循环:合并操作voidoptimizedLoop(){constint size =10000; std::vector<int>vec1(size,1); std::vector<int>vec2(size,2); std::vector<int>result(size,0);for(int i =0; i < size;++i){ result[i]= vec1[i]+ vec2[i];}}// 未优化的循环:多次遍历voidunoptimizedLoop(){constint size =10000; std::vector<int>vec1(size,1); std::vector<int>vec2(size,2); std::vector<int>result(size,0);for(int i =0; i < size;++i){ result[i]= vec1[i];}for(int i =0; i < size;++i){ result[i]+= vec2[i];}}intmain(){ std::cout <<"=== 循环优化示例 ==="<< std::endl;// 测量优化循环和未优化循环的性能auto start = std::chrono::high_resolution_clock::now();optimizedLoop();auto end = std::chrono::high_resolution_clock::now();auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); std::cout <<"优化循环耗时: "<< duration <<"微秒"<< std::endl; start = std::chrono::high_resolution_clock::now();unoptimizedLoop(); end = std::chrono::high_resolution_clock::now(); duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); std::cout <<"未优化循环耗时: "<< duration <<"微秒"<< std::endl;return0;}

4.2 函数优化

#include<iostream>#include<vector>#include<algorithm>// 优化函数:使用内联函数inlineintadd(int a,int b){return a + b;}// 未优化的函数:普通函数调用intaddNotInline(int a,int b){return a + b;}// 测试函数调用开销voidtestFunctionCallOverhead(){constint size =1000000;int result =0;auto start = std::chrono::high_resolution_clock::now();for(int i =0; i < size;++i){ result +=add(i, i);}auto end = std::chrono::high_resolution_clock::now();auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); std::cout <<"内联函数调用耗时: "<< duration <<"微秒"<< std::endl; start = std::chrono::high_resolution_clock::now();for(int i =0; i < size;++i){ result +=addNotInline(i, i);} end = std::chrono::high_resolution_clock::now(); duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); std::cout <<"普通函数调用耗时: "<< duration <<"微秒"<< std::endl;}intmain(){ std::cout <<"=== 函数优化示例 ==="<< std::endl;testFunctionCallOverhead();return0;}

五、I/O操作优化

5.1 文件I/O优化

#include<iostream>#include<fstream>#include<vector>#include<string>// 优化文件I/O:使用缓冲区voidoptimizedFileIO(){const std::string filename ="test.txt";constint size =10000; std::ofstream file(filename); file.rdbuf()->pubsetbuf(nullptr,0);// 禁用缓冲区for(int i =0; i < size;++i){ file << i << std::endl;} file.close();}// 未优化的文件I/O:使用默认缓冲区voidunoptimizedFileIO(){const std::string filename ="test.txt";constint size =10000; std::ofstream file(filename);for(int i =0; i < size;++i){ file << i << std::endl;} file.close();}intmain(){ std::cout <<"=== 文件I/O优化示例 ==="<< std::endl;// 测量优化文件I/O和未优化文件I/O的性能auto start = std::chrono::high_resolution_clock::now();optimizedFileIO();auto end = std::chrono::high_resolution_clock::now();auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); std::cout <<"优化文件I/O耗时: "<< duration <<"微秒"<< std::endl; start = std::chrono::high_resolution_clock::now();unoptimizedFileIO(); end = std::chrono::high_resolution_clock::now(); duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count(); std::cout <<"未优化文件I/O耗时: "<< duration <<"微秒"<< std::endl;return0;}

5.2 网络I/O优化

#include<iostream>#include<vector>#include<string>#include<boost/asio.hpp>#include<chrono>using boost::asio::ip::tcp;usingnamespace std;// 优化网络I/O:使用异步操作voidoptimizedNetworkIO(){try{ boost::asio::io_service io_service; tcp::resolver resolver(io_service); tcp::resolver::query query("example.com","http"); tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); tcp::socket socket(io_service); boost::asio::connect(socket, endpoint_iterator); std::string request ="GET / HTTP/1.1\r\n"; request +="Host: example.com\r\n"; request +="Connection: close\r\n\r\n"; boost::asio::write(socket, boost::asio::buffer(request)); boost::asio::streambuf response; boost::asio::read_until(socket, response,"\r\n"); string status_line; istringstream response_stream(&response); response_stream >> status_line;}catch(const std::exception& e){ cerr <<"错误: "<< e.what()<< endl;}}// 未优化的网络I/O:使用同步操作voidunoptimizedNetworkIO(){try{ boost::asio::io_service io_service; tcp::resolver resolver(io_service); tcp::resolver::query query("example.com","http"); tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); tcp::socket socket(io_service); boost::asio::connect(socket, endpoint_iterator); std::string request ="GET / HTTP/1.1\r\n"; request +="Host: example.com\r\n"; request +="Connection: close\r\n\r\n"; boost::asio::write(socket, boost::asio::buffer(request)); string response;char buffer[1024]; size_t len;while((len = socket.read_some(boost::asio::buffer(buffer)))>0){ response.append(buffer, len);}}catch(const std::exception& e){ cerr <<"错误: "<< e.what()<< endl;}}intmain(){ std::cout <<"=== 网络I/O优化示例 ==="<< std::endl;// 测量优化网络I/O和未优化网络I/O的性能auto start = std::chrono::high_resolution_clock::now();optimizedNetworkIO();auto end = std::chrono::high_resolution_clock::now();auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count(); std::cout <<"优化网络I/O耗时: "<< duration <<"毫秒"<< std::endl; start = std::chrono::high_resolution_clock::now();unoptimizedNetworkIO(); end = std::chrono::high_resolution_clock::now(); duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count(); std::cout <<"未优化网络I/O耗时: "<< duration <<"毫秒"<< std::endl;return0;}

六、综合案例:优化矩阵乘法算法

6.1 项目结构

MatrixMultiplicationOptimization/ ├── include/ │ └── Matrix.h ├── src/ │ ├── Matrix.cpp │ └── main.cpp └── build/ 

6.2 核心代码

// include/Matrix.h#ifndefMATRIX_H#defineMATRIX_H#include<vector>#include<chrono>usingnamespace std;usingnamespace chrono;classMatrix{public:Matrix(int rows,int cols);Matrix(const vector<vector<int>>& data);intgetRows()const;intgetCols()const;int&operator()(int row,int col);constint&operator()(int row,int col)const; Matrix multiplyNaive(const Matrix& other)const; Matrix multiplyOptimized(const Matrix& other)const;voidprint()const;private:int rows_;int cols_; vector<vector<int>> data_;};#endif// MATRIX_H// src/Matrix.cpp#include"Matrix.h"#include<iostream>Matrix::Matrix(int rows,int cols):rows_(rows),cols_(cols),data_(rows,vector<int>(cols,0)){}Matrix::Matrix(const vector<vector<int>>& data):rows_(data.size()),cols_(data[0].size()),data_(data){}intMatrix::getRows()const{return rows_;}intMatrix::getCols()const{return cols_;}int&Matrix::operator()(int row,int col){return data_[row][col];}constint&Matrix::operator()(int row,int col)const{return data_[row][col];} Matrix Matrix::multiplyNaive(const Matrix& other)const{if(cols_ != other.rows_){throwinvalid_argument("矩阵尺寸不兼容");} Matrix result(rows_, other.cols_);for(int i =0; i < rows_;++i){for(int j =0; j < other.cols_;++j){for(int k =0; k < cols_;++k){result(i, j)+= data_[i][k]* other.data_[k][j];}}}return result;} Matrix Matrix::multiplyOptimized(const Matrix& other)const{if(cols_ != other.rows_){throwinvalid_argument("矩阵尺寸不兼容");} Matrix result(rows_, other.cols_); vector<vector<int>> otherTransposed = other.getTransposed();for(int i =0; i < rows_;++i){for(int j =0; j < other.cols_;++j){int sum =0;for(int k =0; k < cols_;++k){ sum += data_[i][k]* otherTransposed[j][k];}result(i, j)= sum;}}return result;} vector<vector<int>>Matrix::getTransposed()const{ vector<vector<int>>transposed(cols_,vector<int>(rows_));for(int i =0; i < rows_;++i){for(int j =0; j < cols_;++j){ transposed[j][i]= data_[i][j];}}return transposed;}voidMatrix::print()const{for(constauto& row : data_){for(int value : row){ cout << value <<" ";} cout << endl;}}// src/main.cpp#include<iostream>#include<vector>#include<chrono>#include"Matrix.h"usingnamespace std;usingnamespace chrono;intmain(){ std::cout <<"=== 矩阵乘法优化示例 ==="<< std::endl;// 创建两个矩阵constint size =100; Matrix matrix1(size, size); Matrix matrix2(size, size);for(int i =0; i < size;++i){for(int j =0; j < size;++j){matrix1(i, j)= i + j;matrix2(i, j)= i * j;}}// 测试朴素算法auto start = high_resolution_clock::now(); Matrix resultNaive = matrix1.multiplyNaive(matrix2);auto end = high_resolution_clock::now();auto duration =duration_cast<milliseconds>(end - start).count(); std::cout <<"朴素算法耗时: "<< duration <<"毫秒"<< std::endl;// 测试优化算法 start = high_resolution_clock::now(); Matrix resultOptimized = matrix1.multiplyOptimized(matrix2); end = high_resolution_clock::now(); duration =duration_cast<milliseconds>(end - start).count(); std::cout <<"优化算法耗时: "<< duration <<"毫秒"<< std::endl;return0;}

6.3 项目构建与运行

# 创建构建目录mkdir-p build &&cd build # 配置CMake cmake -DCMAKE_BUILD_TYPE=Release ..# 编译项目 cmake --build.--config Release # 运行程序 ./MatrixMultiplicationOptimization 

七、总结与练习

7.1 本章总结

本章介绍了C++性能优化的核心知识,包括:

  1. 性能优化的基本概念与原则
  2. 内存管理优化
  3. CPU优化技巧
  4. I/O操作优化
  5. 综合案例:优化矩阵乘法算法

7.2 练习题

  1. 写一个程序,使用GProf或Perf分析代码的性能。
  2. 编写一个函数,使用智能指针避免内存泄漏。
  3. 写一个程序,使用内存对齐优化代码的性能。
  4. 实现一个类,使用循环优化提升代码的执行速度。
  5. 写一个程序,使用异步I/O提升文件读写的效率。

7.3 进阶挑战

  1. 研究如何使用C++的SIMD指令集优化循环。
  2. 学习如何使用C++的并发编程优化CPU密集型任务。
  3. 研究如何使用C++的内存池优化内存管理。
  4. 学习如何使用C++的缓存优化技术提升代码的性能。
  5. 研究如何使用C++的JIT编译技术优化代码的执行速度。

Read more

macOS 安装 Claude Code 完整教程

macOS 安装 Claude Code 完整教程 本文适配 macOS 12+(Monterey 及以上)系统,支持 Intel/Apple Silicon(M1/M2/M3)全机型,涵盖 Claude Code CLI 命令行、VS Code 插件两种核心使用方式的安装、配置与验证流程。 一、前置准备(必做) 1.1 系统与环境要求 * 系统版本:macOS 12.0+(Monterey、Ventura、Sonoma 均支持) * 硬件兼容:Intel 芯片、Apple Silicon(M1/M2/M3)

By Ne0inhk
Linux 高频面试题(50道 + 详细答案)

Linux 高频面试题(50道 + 详细答案)

✅ 覆盖:基础概念、文件系统、安全加固、性能排查、常用命令、实战场景等 🎯 适用于运维工程师、后端开发、DevOps、SRE 等岗位 一、Linux 基础与概述 1. 什么是 Linux? Linux 是一套免费、开源、类 Unix的多用户、多任务操作系统,支持多线程和多 CPU。 * 基于 POSIX 标准 * 继承 Unix “一切皆文件” 和 “网络为核心” 的设计思想 * 广泛用于服务器、嵌入式、云计算等领域 💡 Web 项目几乎全部部署在 Linux 上。 2. Windows 和 Linux 的区别? 对比项WindowsLinux授权商业闭源,需付费开源免费用途桌面娱乐、办公服务器、

By Ne0inhk
Flutter 组件 conduit_open_api 的适配 鸿蒙Harmony 实战 - 驾驭 API 标准化生产、实现鸿蒙端自动契约生成与文档自愈治理方案

Flutter 组件 conduit_open_api 的适配 鸿蒙Harmony 实战 - 驾驭 API 标准化生产、实现鸿蒙端自动契约生成与文档自愈治理方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 conduit_open_api 的适配 鸿蒙Harmony 实战 - 驾驭 API 标准化生产、实现鸿蒙端自动契约生成与文档自愈治理方案 前言 在鸿蒙(OpenHarmony)生态的大规模前后端协同系统、提供开放能力的政务数据网关以及需要严格对齐 0307 批次 API 审计标准的各类大型应用开发中,“接口契约的高保真度与文档同步效率”是决定研发链条能否高效转动的核心。面对包含上百个微服务的复杂系统。如果依然采用基于“手写 Word/WIKI 文档”的传统协同模式。不仅会导致代码与文档之间产生严重的逻辑偏离(Logic Drift),更会因为缺乏一套可被程序自动解析的“契约标准(OpenAPI/Swagger)”,引发鸿蒙端 UI 开发人员在面对接口变更时的重复调试与返工。 我们需要一种“代码为源、契约自愈”的治理艺术。

By Ne0inhk

在 CentOS 7.9 上安装 OpenClaw:完整指南(此文章由openclaw生成)

在 CentOS 7.9 上安装 OpenClaw:完整指南 CentOS 7.9 虽然已经停止维护,但在许多企业环境中仍在运行。本文将详细介绍如何在这个经典系统上部署现代化的 AI 助手框架 OpenClaw。 为什么选择 OpenClaw? OpenClaw 是一个开源的 AI 助手运行时,支持多模型、多通道、技能扩展,让你可以轻松构建个性化的 AI 助手。主要特性: * 🧠 支持 Kimi、Gemini、Claude 等多种大语言模型 * 📱 内置飞书、钉钉、企微、QQ、Telegram 等通道支持 * 🔌 丰富的技能市场(clawhub.com) * ⚡ 轻量级,资源占用低 * 🔧 配置简单,扩展灵活 环境准备 1. 系统要求

By Ne0inhk