SuperAPI AI 工具集

go-performance-review

通用与其它

查看项目

更新于 10-15 21:37

技能介绍

用途:审查 Go 代码中的性能反模式并给出优化建议,核心原则是先剖析、后优化,没有基准测试证明问题就不优化。

主要能力:

  1. 减少内存分配:基本类型转换优先用 strconv 而非 fmt.Sprintf;循环拼接字符串用 strings.Builder;已知大小时预分配切片 make([]T, 0, n) 与 map make(map[K]V, n);频繁创建短生命周期对象用 sync.Pool。
  2. 热路径优化:紧循环中避免 interface{} 装箱拆箱;性能关键路径避免 reflect,可用代码生成(go generate、stringer、protobuf);用连续内存结构减少指针追逐。
  3. map 性能:使用容量提示;读多写少且键稳定时可用 sync.Map;固定键集可用切片加索引映射。
  4. 基准测试:优化前后都要写 Benchmark,用包级变量防止编译器消除调用;运行 go test -bench=BenchmarkFoo -benchmem -count=5 ./...;用 benchstat 对比前后结果。
  5. 性能剖析:CPU 用 go test -cpuprofile=cpu.prof -bench=BenchmarkFoo . 与 go tool pprof cpu.prof;内存用 -memprofile 与 go tool pprof -alloc_space mem.prof;HTTP 服务可导入 net/http/pprof,但必须绑定到 loopback 或内网监听,避免暴露到公网。
  6. 高吞吐日志:多数服务用 log/slog;基准证明日志是瓶颈(高频热路径、每秒超 10 万行)时考虑 zap 或 zerolog;可用 zapslog 将 zap 作为 slog 后端。热路径避免紧循环内逐条打日志,改为采样或批量汇总。
  7. 常见反模式对照:fmt.Sprintf 转 strconv.Itoa、循环拼接转 strings.Builder、切片与 map 预分配、regexp.Compile 提到包级、热路径 json.Marshal 改用代码生成、紧循环日志改批量、极紧内层循环慎用 defer。

限制与注意:大多数 Go 代码并非性能关键,可读性与正确性优先。仅在基准测试证明是瓶颈、优化提升显著(如超过 10%)且代码仍可读可维护时才应用。切换日志库前必须有基准测试证明必要。