在 Linux 下用 C++ 做性能优化,通常可以从编译、系统、算法、语言特性、工具几个层面入手。下面按“由浅入深 + 实战可用”的方式总结。
-O2 # 常用
-O3 # 更激进(有时反而慢)
-Ofast # 忽略标准严格性(谨慎)
-march=native
示例:
g++ -O2 -march=native main.cpp -o app
gold / lld-fuse-ld=lld
-flto
-DNDEBUG
#include <sched.h>
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(2, &mask);
sched_setaffinity(0, sizeof(mask), &mask);
pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
sudo sysctl vm.swappiness=1
适合内存密集型程序(数据库、缓存)。
❌ 错误示范:
std::vector<int> f() {
return std::vector<int>(1000000);
}
✅ 优化:
void f(std::vector<int>& out);
或使用:
std::arraystd::pmr::memory_resourcevoid foo(const std::string& s); // ✅
void foo(std::string s); // ❌
使用 std::move:
std::vector<int> a;
std::vector<int> b = std::move(a);
| 场景 | 推荐 |
|---|---|
| 随机访问 | vector |
| 频繁插入删除 | list / deque |
| 查找 | unordered_map |
| 有序 | map |
⚠️ map 很慢,能用 unordered_map 就别用 map
virtual void update(); // ❌ 热路径
可用:
final❌ 随机访问:
for (auto& col : matrix)
for (auto& row : col)
✅ 行优先:
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
matrix[i][j];
避免频繁 std::thread 创建销毁。
std::atomicboost::lockfree)std::mutex m;
{
std::lock_guard g(m);
// 最小范围
}
mmap适合大文件随机访问。
❌ 一行一行读
✅ 一次读一块
io_uring(Linux 新利器)libaioperf record ./app
perf report
pprof
valgrind --tool=cachegrind ./app
perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > out.svg
std::shared_ptr-O3如果你愿意,可以:
我可以帮你针对性优化。