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

Flutter 三方库 sort_json 的鸿蒙化适配指南 - 实现 JSON 键值的自动化递归排序、支持规范化输出与项目配置文件清理

Flutter 三方库 sort_json 的鸿蒙化适配指南 - 实现 JSON 键值的自动化递归排序、支持规范化输出与项目配置文件清理

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 sort_json 的鸿蒙化适配指南 - 实现 JSON 键值的自动化递归排序、支持规范化输出与项目配置文件清理 前言 在进行 Flutter for OpenHarmony 的工程化开发时,保持项目配置文件(如 package.json、.json5 或各种国际化语言文件)的条理性是至关重要的。特别是在多人协作或版本控制(Git)中,无序的 JSON 键值会导致严重的冲突。sort_json 是一个专注于将 JSON 字符串或文件重新排版并按字母顺序排序的库。本文将探讨如何利用该工具优化鸿蒙项目的配置管理。 一、原理解析 / 概念介绍 1.1 基础原理 sort_json 通过将输入的 JSON

By Ne0inhk
Flutter for OpenHarmony:graphql_codegen 让 GraphQL 开发如丝顺滑,自动化生成类型安全的 Dart 代码(Schema 到 Model) 深度解析与鸿蒙适

Flutter for OpenHarmony:graphql_codegen 让 GraphQL 开发如丝顺滑,自动化生成类型安全的 Dart 代码(Schema 到 Model) 深度解析与鸿蒙适

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 GraphQL 开发中,手动解析 JSON 是极其低效且易出错的。graphql_codegen 通过自动生成的强类型 Dart 代码,让你的开发体验从“黑盒解析”进化到“全量代码提示”。 本指南将结合 OpenHarmony 环境,详细介绍如何配置、编写以及解决常见的版本与构建报错。 一、 核心原理解析 graphql_codegen 的工作流程可以概括为:输入(Schema + Query) -> 编译 -> 输出(Type Safe Dart Code)。 * Schema (lib/schema.graphql): 它是服务端的“说明书”

By Ne0inhk
[特殊字符]颠覆MCP!Open WebUI新技术mcpo横空出世!支持ollama!轻松支持各种MCP Server!Cline+Claude3.7轻松开发论文检索MCP Server!

[特殊字符]颠覆MCP!Open WebUI新技术mcpo横空出世!支持ollama!轻松支持各种MCP Server!Cline+Claude3.7轻松开发论文检索MCP Server!

🔥🔥🔥本篇笔记所对应的视频:🚀颠覆MCP!Open WebUI新技术mcpo横空出世!支持ollama!轻松支持各种MCP Server!Cline+Claude3.7轻松开发MCP服务_哔哩哔哩_bilibili Open WebUI 的 MCPo 项目:将 MCP 工具无缝集成到 OpenAPI 的创新解决方案 随着人工智能工具和模型的快速发展,如何高效、安全地将这些工具集成到标准化的 API 接口中成为了开发者面临的重要挑战。Open WebUI 的 MCPo 项目(Model Context Protocol-to-OpenAPI Proxy Server)正是为了解决这一问题而设计的。本文将带您深入了解 MCPo 的功能、优势及其对开发者生态的影响。 什么是 MCPo? MCPo 是一个简单、可靠的代理服务器,能够将任何基于 MCP 协议的工具转换为兼容

By Ne0inhk