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

C++ 拷贝构造函数与赋值运算符:深拷贝与浅拷贝的核心辨析

C++ 拷贝构造函数与赋值运算符:深拷贝与浅拷贝的核心辨析

C++ 拷贝构造函数与赋值运算符:深拷贝与浅拷贝的核心辨析 💡 学习目标:掌握拷贝构造函数与赋值运算符的定义及调用场景,理解深拷贝与浅拷贝的本质区别,能够在实际开发中避免内存泄漏与野指针问题。 💡 学习重点:拷贝构造函数的触发条件、浅拷贝的缺陷、深拷贝的实现方法、赋值运算符的重载原则。 一、拷贝构造函数的概念与触发场景 ✅ 结论:拷贝构造函数是一种特殊的构造函数,用于通过一个已存在的对象创建一个新对象,其参数必须是本类对象的常量引用(const 类名&)。 1.1 拷贝构造函数的语法格式 class 类名 {public:// 普通构造函数 类名(参数列表);// 拷贝构造函数 类名(const 类名& other);}; ⚠️ 注意事项: 1. 拷贝构造函数的参数必须是常量引用,使用 const 防止实参被修改,使用引用避免无限递归调用拷贝构造函数。 2. 如果没有手动定义拷贝构造函数,编译器会自动生成一个默认拷贝构造函数,实现简单的成员变量值拷贝。 1.2 拷贝构造函数的触发条件

By Ne0inhk
系统学习C++-第二十一讲-用哈希表封装 myunordered_map 和 myunordered_set

系统学习C++-第二十一讲-用哈希表封装 myunordered_map 和 myunordered_set

系统学习C++-第二十一讲-用哈希表封装 myunordered_map 和 myunordered_set * 1. 源码及框架分析 * 2. 模拟实现 unordered_map 和 unordered_set * 2.1 实现出复用哈希表的框架,并支持 insert * 2.2 支持 iterator 的实现 * 2.3 map 支持 ` [] ` * 2.4 unordered_map 和 unordered_set 代码实现 1. 源码及框架分析 SGI-STL30 版本源代码中没有 unordered_map 和 unordered_set ,SGI-STL30 版本是 C+

By Ne0inhk
【C++详解】C++ 智能指针:使用场景、实现原理与内存泄漏防治

【C++详解】C++ 智能指针:使用场景、实现原理与内存泄漏防治

文章目录 * 一、智能指针的使⽤场景分析 * 二、RAII和智能指针的设计思路 * 三、C++标准库智能指针的使⽤ * 四、智能指针的原理 * shared_ptr源码 * 五、shared_ptr和weak_ptr * shared_ptr循环引⽤问题 * weak_ptr * 六、内存泄漏 * 什么是内存泄漏,内存泄漏的危害 * 如何避免内存泄漏 一、智能指针的使⽤场景分析 我们知道C++是是公认的高效编程语言,其中一点原因就是C++手动内存管理(new/delete),避免了很多高级语言(如 Java、Python)的自动内存管理(垃圾回收)带来的额外开销,这也是一把双刃剑,这对C++程序员的要求就会更高,因为手动内存管理很容易出现内存泄漏的问题,我们之前的说法是尽可能小心,但是有些场景无法避免会出现内存泄漏(或者处理起来很麻烦)

By Ne0inhk