← ClaudeAtlas

go-performancelisted

Go 性能优化工作台(Go 1.25.9+ 基线)- 决策优先的性能任务 runbook:基准测试(for b.Loop)、pprof/trace/flight recorder、逃逸分析、内联、内存对齐、sync.Pool、零分配模式(unsafe.String/Slice)、weak.Pointer 缓存、GOMEMLIMIT/容器感知 GOMAXPROCS、PGO、Green Tea GC、编译产物瘦身。适用:代码路径性能调优、内存/CPU 瓶颈定位、高吞吐服务调参、基准回归分析、降低 GC 压力、减小二进制体积。不适用:算法选型(用 algorithms)、业务架构重构(用 backend-patterns)、未测量前的预优化(违反决策优先原则)、运行时原理学习(用 go-runtime)。触发词:performance, 性能, optimize, 优化, benchmark, 基准, pprof, profile, profiling, escape analysis, 逃逸分析, inline, 内联, 内存对齐, alignment, fieldalignment, sync.Pool, 零分配, allocation, zero-alloc, PGO, GOMEMLIMIT, GOMAXPROCS, trace, flight recorder, synctest, weak pointer, 瓶颈, 调优, ldflags
omeyang/Thoth · ★ 0 · AI & Automation · score 73
Install: claude install-skill omeyang/Thoth
# Go 性能优化工作台 执行性能优化任务:$ARGUMENTS **基线 Go 1.25.9+。示例默认用最新语法;旧写法仅在对比中出现。** --- ## 决策优先:先别优化 任何"优化这段代码"的请求,必须先走这三步,跳过任何一步都不合格: 1. **有 benchmark 吗?** 没有 → 先写 baseline(§1) 2. **有 profile 证据吗?** 没有 → 先 pprof/trace(§2) 3. **有数字目标吗?** 没有 → 明确"X µs/op → Y µs/op" **禁止预优化**。任何改动必须有 `benchstat` 前后对比(p<0.05,幅度≥3%)。 ### 诊断决策树 ``` 收到"优化 X"请求 ├─ 有 baseline benchmark? 无 → §1 ├─ 有 profile 证据? 无 → §2 ├─ 热点属于哪一类? │ ├─ CPU 热点 → §3 逃逸/内联/算法 │ ├─ 分配热点 → §4 sync.Pool/预分配/unsafe/weak │ ├─ 锁/并发 → §5 sync 选型/atomic COW/synctest │ ├─ GC 停顿 → §6 GOMEMLIMIT/对齐/Green Tea │ └─ 启动/镜像 → §7 ldflags/PGO └─ 必做:benchstat + profile 前后对比 + 正确性回归 ``` --- ## §1 基准测试 —— Go 1.24+ `for b.Loop()` 是新默认 **新代码必须用 `for b.Loop()`**。它解决旧写法两大坑:编译器不 DCE 循环体;setup/teardown 自动排除。 ```go func BenchmarkParse(b *testing.B) { data := loadTestData() // setup 自动排除 b.ReportAllocs() for b.Loop() { // Go 1.24+ _, _ = Parse(data) } } ``` 反模式(Go 1.23 及以前): ```go // 编译器可能消除无副作用调用;setup 放错位置进入循环 for i := 0; i < b.N; i++ { _, _ = Parse(data) } ``` ### 基准矩阵(规模 × 实现) 用 `b.Run` 两层嵌套:外层规模(100 / 10k / 1M),内层候选实现,每 iter 内 `StopTimer/StartTimer` 排除数据生成。完整样板见 `go-test` 技能的"基准矩阵"章节。 ### benchstat 对比(优化验证唯一权威) ```bash go test -run=^$ -bench=BenchmarkParse -count=10 -benchmem > old.txt # --- 修改 --- go test -run=^$ -bench=BenchmarkParse -count=10 -benchmem > new.txt go install golang.org/x/perf/cmd/benchstat@latest benchstat old.txt new.txt ``` **判读规则**:只接受 `p