C++应用程序性能优化:实用方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么C++优化是一门艺术



C++理所当然被认为是最具性能的编程语言之一。然而,高性能并非自动获得——它需要努力争取。开发者常常因为不了解典型陷阱或错误使用标准库,而编写出比应有速度慢2-10倍的代码。



在本文中,我们将探讨实际的实用方法来优化C++应用程序。您将学习如何对代码进行性能分析、选择正确的容器、使用移动语义和向量化。每个部分都包含可直接应用于您项目的代码示例。



本文面向已经熟悉C++基础,但希望将程序性能提升到新水平的开发者。



1. 性能分析:不要猜测——要测量



优化的第一条规则:永远不要盲目优化。没有性能分析,您可能会花费数小时加速本来已经很快的代码,而真正的瓶颈却被忽视。



性能分析工具

  • Valgrind (Callgrind) — 详细的执行时间和缓存未命中分析。
  • perf (Linux) — 系统级性能分析器,开销极小。
  • Visual Studio Profiler — Windows内置工具。
  • Google Benchmark — 用于单个函数的微基准测试。


使用Google Benchmark的微基准测试示例

#include <benchmark/benchmark.h>#include <vector>#include <algorithm>

// 慢速版本:按值复制static void BM_SlowSort(benchmark::State& state) { std::vector<int> data(state.range(0)); std::generate(data.begin(), data.end(), std::rand); for (auto _ : state) { auto copy = data; // 每次都复制 std::sort(copy.begin(), copy.end()); }}BENCHMARK(BM_SlowSort)->Range(8, 8<<10);

// 快速版本:原地排序static void BM_FastSort(benchmark::State& state) { std::vector<int> data(state.range(0)); std::generate(data.begin(), data.end(), std::rand); for (auto _ : state) { auto copy = data; std::sort(copy.begin(), copy.end()); }}BENCHMARK(BM_FastSort)->Range(8, 8<<10);

BENCHMARK_MAIN();


性能分析将显示,复制与原地操作之间的差异可能达到50%或更多。在修改代码之前,始终要进行测量。



2. 选择高效的容器和算法



C++标准库提供了许多容器,但并非所有容器都同样适用于每个任务。错误的选择可能导致额外的内存分配、缓存未命中和性能损失。



何时使用std::vector,何时使用std::list?

  • std::vector — 对于顺序数据几乎总是最佳选择。它提供内存局部性(缓存友好)和最小的开销。
  • std::list — 仅当您需要频繁在容器中间插入/删除元素,且元素数量非常大时才合理。
  • std::deque — 适用于队列,其中插入/删除发生在两端。


示例:性能比较

#include <vector>#include <list>#include <chrono>#include <iostream>

int main() { const int N = 100000; // 在vector开头插入(慢) auto start = std::chrono::high_resolution_clock::now(); std::vector<int> v; for (int i = 0; i < N; ++i) { v.insert(v.begin(), i); } auto end = std::chrono::high_resolution_clock:

博客

书籍推荐