Analyze and optimize Go program performance. Use when asked to profile Go code, find performance bottlenecks, analyze memory allocations, detect memory leaks, write benchmarks, or optimize CPU/memory usage.
Installation
Details
Usage
After installing, this skill will be available to your AI coding assistant.
Verify installation:
skills listSkill Instructions
name: go-performance description: Analyze and optimize Go program performance. Use when asked to profile Go code, find performance bottlenecks, analyze memory allocations, detect memory leaks, write benchmarks, or optimize CPU/memory usage.
Go Performance
Workflow
- Identify profile source (file, URL, or generate from tests/server)
- Analyze with
go tool pprof - Report findings with actionable recommendations
Quick Reference
| Profile | Test Flag | HTTP Endpoint |
|---|---|---|
| CPU | -cpuprofile | /debug/pprof/profile |
| Heap | -memprofile | /debug/pprof/heap |
| Goroutine | - | /debug/pprof/goroutine |
Key Commands
# Generate from benchmarks
go test -bench=. -cpuprofile cpu.prof -memprofile mem.prof
# Analyze (interactive or one-liner)
go tool pprof -top -cum cpu.prof
go tool pprof -http=:8080 cpu.prof # web UI with flame graphs
# Memory analysis
go tool pprof -alloc_space -top mem.prof # bytes allocated
go tool pprof -alloc_objects -top mem.prof # allocation count (GC pressure)
# Compare profiles (find leaks/regressions)
go tool pprof -base old.prof new.prof
# Filter results
go tool pprof -focus='mypackage.*' cpu.prof
Tips
- Write a benchmark first to reproduce/confirm/measure the issue
- Focus on quick wins first: easy fixes with high impact
- If hotspots are in external libraries, still analyze - source is in
$GOPATH - CPU profiles need 30+ seconds for meaningful data
- For memory leaks: compare heap profiles at two points in time
- Use
-baseflag to find regressions between profiles
Writing benchmarks
Every time we work on some performance issue, we should:
- make sure there is a benchmark
- if there isn't one, we create it, calling the function that we aim to improve
Then, we create a second benchmark, and a new production function with the changes we want.
This way we can quickly run and compare both benchmarks.
Once we're happy with the changes, we replace the old function and old benchmark with the new ones.
Commit messages should always have the benchmark results in them.
More by caarlos0
View allGet documentation for any Go library using `go doc`. Use when asked about Go package documentation, API reference, function signatures, or how to use a specific Go library/package.
Prefer local git commands over GitHub MCP tools for operations on the current repository. Use when asked about commits, diffs, file history, branches, logs, blame, or viewing file contents at specific revisions in the current repo.
Simplify and refine code for clarity, consistency, and maintainability while preserving functionality. Use when asked to "simplify", "clean up", or "refactor" code, after writing complex code that could benefit from simplification, or when code has grown hard to follow.
