在 Linux 下用 C++ 做代码优化,通常可以分编译期优化、代码级优化、系统/运行环境优化几个层面来做。下面按实战角度给你一个清晰的总结。
-O2 # 常用,性价比高
-O3 # 更激进,可能增大体积
-Os # 优化体积(嵌入式常用)
示例:
g++ -O2 -o app app.cpp
-march=native # 针对当前 CPU
-mtune=native
g++ -O2 -march=native app.cpp
-flto
g++ -O2 -flto -o app app.cpp
# 1. 插桩编译
g++ -O2 -fprofile-generate app.cpp
# 2. 运行程序(覆盖典型场景)
./app
# 3. 重新编译
g++ -O2 -fprofile-use app.cpp
void f(const std::string& s); // ✅
void f(std::string s); // ❌
使用 std::move:
std::vector<int> v = std::move(other);
| 场景 | 推荐 |
|---|---|
| 随机访问 | std::vector |
| 频繁插入删除 | std::list / std::deque |
| 查找 | std::unordered_map |
| 有序 | std::map |
std::vector::reservenew/deletestd::vector<int> v;
v.reserve(10000);
std::atomicboost::lockfree)// 不友好
for (int i = 0; i < v.size(); i++)
// 更好
for (size_t i = 0, n = v.size(); i < n; ++i)
perf record ./app
perf report
找:
g++ -pg app.cpp
./app
gprof app gmon.out
valgrind --tool=callgrind ./app
perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > out.svg
mmapio_uring)#include <sched.h>
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask);
sched_setaffinity(0, sizeof(mask), &mask);
对内存密集型程序有效。
❌ 过早优化
✅ 先 profiling,再优化
❌ 盲目用 -O3
✅ 测试是否真的更快
❌ 手写汇编
✅ 现代编译器通常更好
-O2 编译perf 找热点如果你有具体场景(如:网络服务 / 计算密集 / 游戏 / 嵌入式),我可以给你更针对性的优化建议,甚至帮你改代码示例。