在 Linux 下用 C++ 提升性能,通常可以从编译优化、系统配置、代码层面、工具分析四个方向入手。下面按“优先级 + 实战性”给你一个系统清单。
-O2 # 常用,安全且高效
-O3 # 更激进(可能增大体积,有时反而慢)
-Ofast # 忽略严格标准(浮点可能不准)
推荐:
g++ -O2 -march=native -mtune=native main.cpp
-march=native
让编译器使用当前 CPU 的指令集(AVX / SSE 等)
-flto
配合:
-O2 -flto
-D_GLIBCXX_USE_CXX11_ABI=1
或切换:
libstdc++(默认)libc++(Clang)-DNDEBUG
taskset -c 0,1 ./app
或在代码里:
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(0, &mask);
sched_setaffinity(0, sizeof(mask), &mask);
sudo cpupower frequency-set -g performance
ulimit -n 100000
调整:
net.core.somaxconnvm.swappiness❌ 频繁 new / delete
✅ 使用:
std::vector::reservestd::vector<int> v;
v.reserve(100000);
void f(const std::string& s); // ✅
void f(std::string s); // ❌
使用:
std::move
emplace_back
✅ 顺序访问 ❌ 随机跳表 / 指针乱跳
for (int i = 0; i < N; i++) a[i]++; // 快
std::threadstd::atomic避免:
| 场景 | 推荐 |
|---|---|
| 查找 | unordered_map |
| 排序 | std::sort |
| 大量小对象 | 对象池 |
| 字符串 | string_view |
perf record ./app
perf report
看:
valgrind --tool=callgrind ./app
g++ -pg main.cpp
./a.out
gprof a.out gmon.out
-fsanitize=address
-fsanitize=thread
❌ 在 hot path 用 std::endl
✅ 用 '\n'
❌ 频繁 std::cout
✅ 批量输出 / 异步日志
❌ 滥用虚函数 ✅ 模板 / CRTP
你可以告诉我:
我可以直接给你针对性优化方案或示例代码。