性能分析

性能分析

perf stat ./program        # 总览:cycles, instructions, cache-misses, branch-misses
perf record ./program      # 采样
perf report                # 查看热点
perf annotate              # 指令级

# 关键指标
# IPC (instructions per cycle): 现代 CPU 理想 4+,低于 1 说明在等内存
# cache-miss rate: > 5% 就该优化内存访问
# branch-miss rate: > 5% 就该优化分支

Top-down 分析方法:

1. 是不是被内存带宽限制?(cache miss 高)
2. 是不是被分支限制?(branch miss 高)
3. 是不是被依赖链限制?(IPC 低但不 miss)
4. 是不是指令数太多?(没向量化)

常见坑

  • 把"指令少"等同于"快":现代 CPU 上,cache miss 的代价远超几条指令
  • 以为 i++ 比 ++i 慢:对 int 完全一样(编译器会优化);对迭代器有理论差异
  • volatile 当成原子操作:volatile 只防止编译器优化,不保证原子性、不保证内存序
  • 伪共享:多线程反而变慢,最难查
  • 对齐问题:未对齐访问在某些架构上会崩或极慢
  • 浮点比较用 ==
  • 有符号溢出:UB,编译器可能做出奇怪的优化(如删掉 if (x + 1 > x))
  • memcpy 的别名:源和目标重叠时 UB(用 memmove)
  • 忽略分支预测:随机分支是最容易被忽视的性能杀手
  • 以为多核一定快:同步和缓存一致性的开销可能超过收益