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

开源浪潮下的中国力量:文心一言大模型本地部署与应用全攻略

开源浪潮下的中国力量:文心一言大模型本地部署与应用全攻略

文章目录 * 一、前言 * 1.1 模型开源意义与背景 * 1.2 文心一言大模型简介 * 1.3 测评目标与思路 * 二、文心一言大模型 * 2.1 文心一言开源概况 * 2.2 文心一言大模型技术综述 * 三、文心一言大模型深度解析 * 3.1 开源策略与生态影响 * 3.1.1 开源时间与版本介绍 * 3.2 模型特性与优势 * 四、部署实战:从 GitCode下载ERNIE-4.5-0.3B 模型到本地可交互服务 * 4.1 环境准备与部署方式 * 4.2 下载与安装步骤 * 4.3 调用示例与接口说明 * 编写部署测试脚本 * 五、

知网vs维普AIGC检测:哪个更严格?实测数据告诉你答案

知网vs维普AIGC检测:哪个更严格?实测数据告诉你答案

知网vs维普AIGC检测:哪个更严格?实测数据告诉你答案 TL;DR:结论先放这里——知网AIGC检测在学术文本上更严格,维普在通用文本上更严格。同一篇论文,知网可能检测出AI率60%,维普可能检测出75%。但最终以学校指定平台为准。如果两边都要过,建议用嘎嘎降AI处理,它同时适配知网和维普,达标率99.26%。 知网和维普的检测原理有什么不同? 很多同学以为知网和维普只是名字不同,检测原理应该差不多。其实它们的底层算法和侧重点完全不一样。知网用的是AIGC检测算法3.0版本,主要依托自己的学术数据库,侧重分析学术文本的特征。它识别的重点是:句式模板化(比如「首先…其次…最后」这种套路)、高频词汇堆砌、逻辑结构固化、以及表达模式过于规整。简单说,知网对「写得太标准」的文本特别敏感。 维普的检测系统则基于自然语言处理和深度学习技术,会从词汇、语法、语义等多个维度分析文本特征。维普的数据资源更广泛,不仅覆盖学术文献,还包括新闻、网页等非学术内容,所以它在检测「通用AI写作」方面更敏感。

Windows 环境下 llama.cpp 编译 + Qwen 模型本地部署全指南

在大模型落地场景中,本地轻量化部署因低延迟、高隐私性、无需依赖云端算力等优势,成为开发者与 AI 爱好者的热门需求。本文聚焦 Windows 10/11(64 位)环境,详细拆解 llama.cpp 工具的编译流程(支持 CPU/GPU 双模式,GPU 加速需依赖 NVIDIA CUDA),并指导如何通过 modelscope 下载 GGUF 格式的 Qwen-7B-Chat 模型,最终实现模型本地启动与 API 服务搭建。 1.打开管理员权限的 PowerShell/CMD,执行以下命令克隆代码: git clone https://github.com/ggml-org/llama.cpp mkdir

告别学术焦虑:PaperZZ 如何让降重与降 AIGC 从 “反复修改” 到 “一次通过”

告别学术焦虑:PaperZZ 如何让降重与降 AIGC 从 “反复修改” 到 “一次通过”

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 降重/降AIGChttps://www.paperzz.cc/weight 在学术写作的最后一公里,查重与 AIGC 检测如同两道无形的门槛,横亘在无数学生和研究者面前。当你满怀信心提交论文,却收到一份标红率高达 40% 的查重报告,或是因 AI 生成痕迹明显被导师驳回时,那种挫败感与焦虑感,想必很多人都深有体会。传统的降重方式,要么是逐字逐句的 “文字游戏”,要么是简单的同义词替换,不仅效率低下,还容易导致语句不通、逻辑混乱,甚至出现 “降重后比原文更难读” 的尴尬局面。而 PaperZZ 的降重 / 降 AIGC 功能,正是为破解这一困境而生 —— 它并非帮你 “作弊”,而是通过专业的语义重塑技术,在保持原文核心思想与学术严谨性的前提下,高效解决重复率与 AI 痕迹问题,让你的学术成果顺利通过检测,