C++ 提供了实现极致性能的能力,但高性能代码不会自动产生。从编译器优化到缓存友好的数据结构,性能优化需要系统性的思考和实践。
让编译器为你优化
- inline 与链接时优化:LTO 让编译器可以跨翻译单元内联和优化。
- constexpr 与编译期计算:将计算从运行时移到编译期。
- 返回值优化:不要返回 std::move(局部变量),这会阻止 RVO。
缓存友好的编程
CPU 缓存是现代性能的关键。一个 L1 缓存访问约 1ns,而主内存访问约 100ns。让数据在内存中连续排列,按顺序访问,可以大幅提升性能。
// 缓存友好:按行遍历
for (int i = 0; i < rows; ++i)
for (int j = 0; j < cols; ++j)
sum += matrix[i][j];
// 缓存不友好:按列遍历(性能差 10x+)
for (int j = 0; j < cols; ++j)
for (int i = 0; i < rows; ++i)
sum += matrix[i][j];
内存分配策略
减少动态内存分配是优化的重要手段:使用栈分配优先、对象池、预分配 + 原地构造、小字符串优化等。尽量使用 make_unique/make_shared 避免二次分配。
性能优化不是玄学——先测量,再优化,最后再测量。