性能优化知识体系概览
问题
Go 性能优化有哪些方面?整体思路是什么?
答案
优化思路
优化原则
- 先测量,后优化:没有数据的优化是瞎猜
- Benchmark 驱动:优化前后必须 Benchmark 对比
- 抓大放小:先优化热点函数(Top 10%)
- 避免过早优化:先保证正确,再提升性能
优化层次
| 层次 | 手段 | 效果 |
|---|---|---|
| 算法 | 更优算法/数据结构 | ⭐⭐⭐⭐⭐ |
| 架构 | 缓存、异步、批处理 | ⭐⭐⭐⭐ |
| 内存 | 减少分配、对象池 | ⭐⭐⭐ |
| 并发 | goroutine 池、减少锁 | ⭐⭐⭐ |
| IO | 批量读写、连接池 | ⭐⭐⭐ |
| 编译 | 编译优化、PGO | ⭐⭐ |
Go 性能工具链
| 工具 | 用途 |
|---|---|
go test -bench | Benchmark 基准测试 |
pprof | CPU / 内存 / goroutine 分析 |
go tool trace | 调度/GC/网络事件追踪 |
benchstat | Benchmark 结果统计对比 |
-race | 竞态检测 |
-gcflags="-m" | 逃逸分析 |
常见面试问题
Q1: Go 程序遇到性能问题应该怎么排查?
答案:
1. 确认症状:CPU 高?内存增长?延迟大?QPS 上不去?
2. pprof 采集:CPU profile / Heap profile / Goroutine
3. 分析热点:Top 函数 → 调用链 → 源码行
4. Benchmark 复现:写 Benchmark 隔离问题
5. 优化 + 验证:修改代码 → Benchmark 对比 → 线上验证
Q2: Go 相比 Java 在性能上有什么优劣?
答案:
- 优势:编译为原生代码(无 JIT 预热)、goroutine 轻量(创建成本极低)、GC 延迟短
- 劣势:缺少 JIT 的运行时优化(PGO 是编译时的)、泛型性能仍有可优化空间