在 Ubuntu 下做 C++ 性能优化,通常可以从 编译器、代码、系统、工具链 四个层面入手。下面给你一个比较系统、实战向的总结。
g++ -O2 main.cpp -o main
常用优化等级:
| 选项 | 说明 |
|---|---|
-O0 |
不优化(调试用) |
-O1 |
基础优化 |
-O2 |
推荐,性价比最高 |
-O3 |
激进优化(可能增大体积) |
-Os |
优化体积 |
-Ofast |
激进 + 忽略标准(慎用) |
✅ 生产环境一般 -O2 或 -O3
g++ -O2 -march=native -mtune=native main.cpp
-march=native:使用当前 CPU 的全部指令集(AVX / AVX2 / SSE 等)
g++ -O2 -flto main.cpp -o main
✅ 对大型项目效果明显
void f(const std::string& s); // ✅
void f(std::string s); // ❌
✅ 使用:
const &std::moveemplace_back 代替 push_back| 场景 | 推荐 |
|---|---|
| 随机访问 | vector |
| 插入删除多 | list / deque |
| 查找 | unordered_map |
| 有序 | map |
⚠️ vector 通常比 list 快(缓存友好)
// 不好
for (...) {
std::string s;
}
// 更好
std::string s;
for (...) {
s.clear();
}
✅ 对象复用、内存池
for (int i = 0; i < v.size(); ++i) // ❌
for (size_t i = 0; i < v.size(); ++i) // ❌
for (auto& x : v) // ✅
✅ 避免 size() 每次计算
✅ 使用引用避免拷贝
虚函数 = 间接调用,影响内联和分支预测
✅ 非必要不用 virtual
#include <thread>
✅ 适合:
⚠️ 注意:
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
...
}
编译:
g++ -O2 -fopenmp main.cpp
sudo apt install g++-12
或:
g++-12 -O2 main.cpp
strip main
sudo cpupower frequency-set -g performance
sudo apt install linux-tools-common
perf stat ./main
perf record ./main
perf report
✅ 看热点函数、CPU 指令
g++ -pg main.cpp
./main
gprof ./main gmon.out
valgrind --tool=cachegrind ./main
✅ 看缓存命中率
sudo apt install heaptrack
heaptrack ./main
| 误区 | 说明 |
|---|---|
| 过早优化 | 先写正确代码 |
盲目 -O3 |
可能变慢 |
用 std::endl |
用 '\n' |
频繁 new/delete |
用栈或复用 |
| 锁太多 | 锁粒度要小 |
如果你愿意,可以把:
发出来,我可以 直接帮你定位瓶颈并给出优化方案。