# Golang Performance > Patrones y metodología de optimización de rendimiento en Golang: si hay cuello de botella X, aplica el patrón Y, una vez que profiling o benchmarks ya lo identificaron. Fuente: https://skillsagentes.com/skills/samber/cc-skills-golang/golang-performance Markdown: https://skillsagentes.com/skills/samber/cc-skills-golang/golang-performance.md Repositorio: https://github.com/samber/cc-skills-golang Autor: samber Licencia: MIT Actualizado: el mes pasado Coste de contexto: 160 tok instalada, 2.3k tok al activarse, 42.1k tok con todos los archivos del bundle Bundle: 9 archivos, 164 KB Permisos que pide: read edit write glob grep bash(go:*) bash(golangci-lint:*) bash(git:*) agent webfetch bash(benchstat:*) bash(fieldalignment:*) bash(staticcheck:*) bash(curl:*) bash(fgprof:*) bash(perf:*) websearch askuserquestion enterworktree exitworktree ## Instalación Un skill son archivos markdown: los mismos archivos valen para cualquier agente y lo único que cambia es el directorio de destino, es decir la bandera `--agent`. Añade `-g` para instalarlo en todos los proyectos de la máquina. ```bash # Claude Code npx -y skills add samber/cc-skills-golang --skill golang-performance --agent claude-code # Cursor npx -y skills add samber/cc-skills-golang --skill golang-performance --agent cursor # Codex npx -y skills add samber/cc-skills-golang --skill golang-performance --agent codex # Gemini CLI npx -y skills add samber/cc-skills-golang --skill golang-performance --agent gemini # Windsurf npx -y skills add samber/cc-skills-golang --skill golang-performance --agent windsurf # Cline npx -y skills add samber/cc-skills-golang --skill golang-performance --agent cline ``` ## Qué hace - Aplica el ciclo Definir métrica → Baseline → Diagnosticar → Mejorar → Comparar para optimizar código Go - Ofrece un árbol de decisión que mapea señales de pprof a la acción correcta (asignaciones, CPU, GC, I/O, caching) - Realiza revisiones de rendimiento en modo arquitectura (3 sub-agentes en paralelo) o en modo hot-path (secuencial) - Documenta cada optimización con comentarios y números de benchmark, y exige benchstat antes de confirmar mejoras ## Cuándo usarla - Profiling o benchmarks ya identificaron un cuello de botella y necesitas el patrón correcto para corregirlo - Estás haciendo revisión de código de rendimiento y quieres sugerir mejoras o benchmarks - Necesitas una revisión arquitectónica amplia de un paquete o servicio en busca de anti-patrones estructurales ## Cuándo no - Para metodología de medición, usar el skill golang-benchmark en su lugar - Para el flujo de trabajo de depuración, usar el skill golang-troubleshooting en su lugar ## Qué la activa - "El profiling muestra muchas asignaciones en este endpoint, ¿cómo lo optimizo?" - "Revisa este paquete Go en busca de problemas de rendimiento estructurales" - "Este bucle es CPU-bound según pprof, ¿qué optimización aplico?" - "Ayúdame a documentar esta optimización con benchstat antes de hacer commit" ## Antes de instalar - Requiere el binario `go` y `benchstat` (instalable con `go install golang.org/x/perf/cmd/benchstat@latest`). ## Archivos - SKILL.md — 9 KB - assets/prometheus-alerts.yml — 662 B - evals/evals.json — 92 KB - references/caching.md — 8 KB - references/cpu.md — 17 KB - references/io-networking.md — 13 KB - references/memory.md — 9 KB - references/observability.md — 5 KB - references/runtime.md — 11 KB ## SKILL.md Reproducido tal cual desde samber/cc-skills-golang bajo MIT. Esta sección es el documento original y está en inglés. **Persona:** You are a Go performance engineer. You never optimize without profiling first — measure, hypothesize, change one thing, re-measure. **Thinking mode:** Use `ultrathink` for performance optimization. Shallow analysis misidentifies bottlenecks — deep reasoning ensures the right optimization is applied to the right problem. **Orchestration mode:** Use `ultracode` for a broad architectural performance review — orchestrate the three sub-agents described in Review mode (architecture) (allocation and memory layout, I/O and concurrency, algorithmic complexity and caching). A single hot-path review stays sequential; fan-out only pays off at package/service scope. **Modes:** - **Review mode (architecture)** — broad scan of a package or service for structural anti-patterns (missing connection pools, unbounded goroutines, wrong data structures). Use up to 3 parallel sub-agents split by concern: (1) allocation and memory layout, (2) I/O and concurrency, (3) algorithmic complexity and caching. - **Review mode (hot path)** — focused analysis of a single function or tight loop identified by the caller. Work sequentially; one sub-agent is sufficient. - **Optimize mode** — a bottleneck has been identified by profiling. Follow the iterative cycle (define metric → baseline → diagnose → improve → compare) sequentially — one change at a time is the discipline. **Dependencies:** - benchstat: `go install golang.org/x/perf/cmd/benchstat@latest` # Go Performance Optimization ## Core Philosophy 1. **Profile before optimizing** — intuition about bottlenecks is wrong ~80% of the time. Use pprof to find actual hot spots (→ See `samber/cc-skills-golang@golang-troubleshooting` skill) 2. **Allocation reduction yields the biggest ROI** — Go's GC is fast but not free. Reducing allocations per request often matters more than micro-optimizing CPU 3. **Document optimizations** — add code comments explaining why a pattern is faster, with benchmark numbers when available. Future readers need context to avoid reverting an "unnecessary" optimization ## Rule Out External Bottlenecks First Before optimizing Go code, verify the bottleneck is in your process — if 90% of latency is a slow DB query or API call, reducing allocations won't help. **Diagnose:** 1- `fgprof` — captures on-CPU and off-CPU (I/O wait) time; if off-CPU dominates, the bottleneck is external 2- `go tool pprof` (goroutine profile) — many goroutines blocked in `net.(*conn).Read` or `database/sql` = external wait 3- Distributed tracing (OpenTelemetry) — span breakdown shows which upstream is slow **When external:** optimize that component instead — query tuning, caching, connection pools, circuit breakers (→ See `samber/cc-skills-golang@golang-database` skill, [Caching Patterns](references/caching.md)). ## Iterative Optimization Methodology ### The cycle: Define Goals → Benchmark → Diagnose → Improve → Benchmark 1. **Define your metric** — latency, throughput, memory, or CPU? Without a target, optimizations are random 2. **Write an atomic benchmark** — isolate one function per benchmark to avoid result contamination (→ See `samber/cc-skills-golang@golang-benchmark` skill) 3. **Measure baseline** — `go test -bench=BenchmarkMyFunc -benchmem -count=6 ./pkg/... | tee /tmp/report-1.txt` 4. **Diagnose** — use the **Diagnose** lines in each deep-dive section to pick the right tool 5. **Improve** — apply ONE optimization at a time with an explanatory comment 6. **Compare** — `benchstat /tmp/report-1.txt /tmp/report-2.txt` to confirm statistical significance 7. **Commit** — paste the benchstat output in the commit body so reviewers and future readers see the exact improvement; follow the `perf(scope): summary` commit type 8. **Repeat** — increment report number, tackle next bottleneck Refer to library documentation for known patterns before inventing custom solutions. Keep all `/tmp/report-*.txt` files as an audit trail. When multiple candidate optimizations compete for the same bottleneck, implement each in an isolated worktree via a separate sub-agent — then → See `samber/cc-skills-golang@golang-benchmark` skill for comparing the variants and its serial-measurement caveat (concurrent benchmark runs on shared CPU contaminate results, even when the implementations themselves were built in parallel). ## Decision Tree: Where Is Time Spent? | Bottleneck | Signal (from pprof) | Action | | --- | --- | --- | | Too many allocations | `alloc_objects` high in heap profile | [Memory optimization](references/memory.md) | | CPU-bound hot loop | function dominates CPU profile | [CPU optimization](references/cpu.md) | | GC pauses / OOM | high GC%, container limits | [Runtime tuning](references/runtime.md) | | Network / I/O latency | goroutines blocked on I/O | [I/O & networking](references/io-networking.md) | | Repeated expensive work | same computation/fetch multiple times | [Caching patterns](references/caching.md) | | Wrong algorithm | O(n²) where O(n) exists | [Algorithmic complexity](references/caching.md#algorithmic-complexity) | | Lock contention | mutex/block profile hot | → See `samber/cc-skills-golang@golang-concurrency` skill | | Slow queries | DB time dominates traces | → See `samber/cc-skills-golang@golang-database` skill | ## Common Mistakes | Mistake | Fix | | --- | --- | | Optimizing without profiling | Profile with pprof first — intuition is wrong ~80% of the time | | Default `http.Client` without Transport | `MaxIdleConnsPerHost` defaults to 2; set to match your concurrency level | | Logging in hot loops | Log calls prevent inlining and allocate even when the level is disabled. Use `slog.LogAttrs` | | `panic`/`recover` as control flow | panic allocates a stack trace and unwinds the stack; use error returns | | `unsafe` without benchmark proof | Only justified when profiling shows >10% improvement in a verified hot path | | No GC tuning in containers | Set `GOMEMLIMIT` to 80-90% of container memory to prevent OOM kills | | `reflect.DeepEqual` in production | 50-200x slower than typed comparison; use `slices.Equal`, `maps.Equal`, `bytes.Equal` | ## Deep Dives - [Memory Optimization](references/memory.md) — allocation patterns, backing array leaks, sync.Pool, struct alignment - [CPU Optimization](references/cpu.md) — inlining, cache locality, false sharing, ILP, reflection avoidance - [I/O & Networking](references/io-networking.md) — HTTP transport config, streaming, JSON performance, cgo, batch operations - [Runtime Tuning](references/runtime.md) — GOGC, GOMEMLIMIT, GC diagnostics, GOMAXPROCS, PGO - [Caching Patterns](references/caching.md) — algorithmic complexity, compiled patterns, singleflight, work avoidance - [Production Observability](references/observability.md) — Prometheus metrics, PromQL queries, continuous profiling, alerting rules ## CI Regression Detection Automate benchmark comparison in CI to catch regressions before they reach production. → See `samber/cc-skills-golang@golang-benchmark` skill for `benchdiff` and `cob` setup. ## Cross-References - → See `samber/cc-skills-golang@golang-benchmark` skill for benchmarking methodology, `benchstat`, and `b.Loop()` (Go 1.24+) - → See `samber/cc-skills-golang@golang-troubleshooting` skill for pprof workflow, escape analysis diagnostics, and performance debugging - → See `samber/cc-skills-golang@golang-data-structures` skill for slice/map preallocation and `strings.Builder` - → See `samber/cc-skills-golang@golang-concurrency` skill for worker pools, `sync.Pool` API, goroutine lifecycle, and lock contention - → See `samber/cc-skills-golang@golang-safety` skill for defer in loops, slice backing array aliasing - → See `samber/cc-skills-golang@golang-database` skill for connection pool tuning and batch processing - → See `samber/cc-skills-golang@golang-observability` skill for continuous profiling in production ## Dónde encaja - Categoría: [Herramientas para desarrolladores](https://skillsagentes.com/categorias/herramientas-desarrollo.md) — Skills que cambian cómo tu agente escribe, revisa y despliega código. - Creador: [samber](https://skillsagentes.com/creators/samber.md) — 0 skills en el directorio - [Todas las skills](https://skillsagentes.com/skills.md) - [Ranking de instalaciones](https://skillsagentes.com/ranking.md) ## Otras skills del mismo repositorio - [Golang Lint](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-lint.md): Buenas prácticas de linting y configuración de golangci-lint para proyectos Golang: ejecutar linters, configurar .golangci.yml, suprimir avisos con nolint, interpretar salidas y elegir linters. - [Golang How To](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-how-to.md): Orquestador de skills de Golang, siempre activo en cualquier tarea de código, revisión, debug o setup: carga las skills más relevantes de samber/cc-skills-golang, a menudo varias a la vez. - [Golang Benchmark](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-benchmark.md): Benchmarking, profiling y medición de rendimiento en Golang: escribir y comparar benchmarks, perfilar con pprof, analizar con benchstat y detectar regresiones en CI. - [Golang Testing](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-testing.md): Tests de Golang listos para producción: table-driven, suites y mocks con testify, tests paralelos, fuzzing, fixtures, detección de fugas de goroutines con goleak, snapshot testing, cobertura, tests de integración. - [Golang Troubleshooting](https://skillsagentes.com/skills/samber/cc-skills-golang/golang-troubleshooting.md): Depura programas Go de forma sistemática hasta encontrar y corregir la causa raíz: metodología de debugging, errores comunes de Go, pprof, Delve, detección de races y depuración en producción. --- Skills Agentes · [Índice de páginas en markdown](https://skillsagentes.com/sitemap.md) · [Inicio](https://skillsagentes.com/index.md)