Golang Benchmark
Samuel BertheCommunityCreated by samberDistributed by Samuel Berthe
- Skill
- Tool integration
- Software development
- MIT
- Low risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a rigorous methodology for measuring Go performance. It covers the entire lifecycle: writing benchmarks with proper conventions, executing them under controlled conditions, generating profiles (CPU, memory, trace), and performing statistical comparisons using benchstat to distinguish real performance gains from noise. It emphasizes statistical significance and reproducible measurement over anecdotal testing.
What it does
- Guides the creation of Go benchmarks using standard naming and file conventions.
- Provides commands for running benchmarks with memory reporting and statistical iteration counts.
- Facilitates the generation of CPU, memory, and execution trace profiles for deep analysis.
- Uses benchstat to perform A/B comparisons with statistical confidence intervals.
- Offers strategies for integrating performance regression detection into CI pipelines.
- Explains how to document performance improvements in commit messages using benchmark data.
When to use it
- When you need to measure the performance impact of a code change with statistical rigor.
- When investigating performance bottlenecks using CPU or memory profiling.
- When setting up automated performance regression gating in CI.
- When comparing multiple optimization variants to identify the most effective approach.
- When you need to verify that a code change has a measurable impact before committing.
Advantages
- Promotes statistical rigor, preventing misleading conclusions from single benchmark runs.
- Standardizes benchmark file naming and function ordering for better maintainability.
- Integrates seamlessly with standard Go tooling and performance analysis utilities.
- Provides clear guidance on avoiding common pitfalls like noisy neighbors and dead-code elimination.
- Enables data-driven performance documentation in git history.
Usage examples
- “How do I run my benchmarks 10 times to ensure statistical significance?”
- The agent will provide the command: go test -run='^$' -bench=. -benchmem -count=10 ./pkg/...
- “Compare my current changes against the main branch for performance regressions.”
- The agent will guide you to use benchdiff to compare git refs, ensuring results are cached and statistically compared.
- “How do I generate and analyze a CPU profile for my benchmark?”
- The agent will show how to run go test with -cpuprofile, followed by using go tool pprof to interactively analyze the resulting file.
- “How should I format my commit message when I optimize a function?”
- The agent will provide a template including the hardware context and the benchstat output table to prove the performance gain.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/samber/golang-benchmark/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip golang-benchmark.zip -d .agents/skills
Documentation by samber
Persona: You are a Go performance measurement engineer. You never draw conclusions from a single benchmark run — statistical rigor and controlled conditions are prerequisites before any optimization decision.
Thinking mode: Reason as thoroughly as possible for benchmark analysis, profile interpretation, and performance comparison tasks — deep reasoning prevents misinterpreting profiling data and ensures statistically sound conclusions. On Claude Code, use ultrathink to trigger extended thinking explicitly.
Dependencies:
benchstat:
go install golang.org/x/perf/cmd/benchstat@latest
Go Benchmarking & Performance Measurement
Performance improvement does not exist without measures — if you can measure it, you can improve it.
This skill covers the full measurement workflow: write a benchmark, run it, profile the result, compare before/after with statistical rigor, and track regressions in CI. For optimization patterns to apply after measurement, → See samber/cc-skills-golang@golang-performance skill. For pprof setup on running services, → See samber/cc-skills-golang@golang-troubleshooting skill.
Writing Benchmarks
File and Ordering Conventions
Benchmark functions live in a _bench_test.go file named after the source file under benchmark, not after the individual function — parser.go -> parser_bench_test.go, containing BenchmarkParse, BenchmarkEncode, etc., not a separate benchmarkparse_test.go per function.
Keeping benchmarks in their own file (instead of mixed into
parser_test.go) keepsgo test -bench=. ./pkg/parseroutput free of unrelatedTest*noise.It separates fixtures sized for measurement (large inputs, long-lived setup) from those sized for correctness — the two rarely share the same shape.
The file still follows Go's one-test-file-per-source-file convention (→ See
samber/cc-skills-golang@golang-testingskill), just with the_benchsuffix marking its narrower purpose.
Order Benchmark* functions inside parser_bench_test.go to mirror the order of the functions/methods they measure in parser.go — a reader comparing the two files top to bottom should find BenchmarkParse at the same relative position as Parse.
b.Loop() (Go 1.24+) — preferred
For Go 1.24+, prefer b.Loop() for new benchmarks. It times only the loop body and keeps function arguments/results alive, which reduces dead-code-elimination mistakes.
func BenchmarkParse(b *testing.B) {
data := loadFixture("large.json") // setup — excluded from timing
for b.Loop() {
Parse(data) // compiler cannot eliminate this call
}
}Legacy b.N loops still compile and are fine to keep when preserving existing benchmarks or supporting Go <1.24. They are easier to get wrong: setup may need b.ResetTimer(), and results may need a sink if the compiler can eliminate the work. Go 1.26 fixed an earlier b.Loop() inlining limitation — benchmarks on 1.24–1.25 already benefit from b.Loop() but may miss inlining optimizations that 1.26 delivers.
Go 1.27's size-specialized allocator changes allocation-heavy benchmark baselines (faster sub-80-byte allocations, larger binaries) independent of any code change. Treat a benchstat comparison that straddles the Go 1.26→1.27 toolchain boundary as measuring the toolchain, not the code — rerun the "before" benchmark on the same toolchain as "after" before trusting the delta.
Memory tracking
func BenchmarkAlloc(b *testing.B) {
b.ReportAllocs() // or run with -benchmem flag
var sink []byte
for b.Loop() {
sink = make([]byte, 1024)
}
_ = sink
}b.ReportMetric() adds custom metrics (e.g., throughput):
b.ReportMetric(float64(totalBytes)/b.Elapsed().Seconds(), "bytes/s") // b.Elapsed() is only valid inside b.Loop()Sub-benchmarks and table-driven
func BenchmarkEncode(b *testing.B) {
for _, size := range []int{64, 256, 4096} {
b.Run(fmt.Sprintf("size=%d", size), func(b *testing.B) {
data := make([]byte, size)
for b.Loop() {
Encode(data)
}
})
}
}Running Benchmarks
go test -bench=BenchmarkEncode -benchmem -count=10 ./pkg/... | tee bench.txt| Flag | Purpose |
|---|---|
-bench=. | Run all benchmarks (regexp filter) |
-benchmem | Report allocations (B/op, allocs/op) |
-count=10 | Run 10 times for statistical significance |
-benchtime=3s | Minimum time per benchmark (default 1s) |
-cpu=1,2,4 | Run with different GOMAXPROCS values |
-cpuprofile=cpu.prof | Write CPU profile |
-memprofile=mem.prof | Write memory profile |
-trace=trace.out | Write execution trace |
Output format: BenchmarkEncode/size=64-8 5000000 230.5 ns/op 128 B/op 2 allocs/op — the -8 suffix is GOMAXPROCS, ns/op is time per operation, B/op is bytes allocated per op, allocs/op is heap allocation count per op.
Comparing Optimization Variants in Parallel
When several competing optimization hypotheses exist for the same bottleneck, implement each variant in its own isolated worktree via a separate sub-agent, so their code changes never collide in the shared working tree.
Run the benchmarks serially, not concurrently. Concurrent benchmark runs share the same CPU — the noisy-neighbor effect contaminates ns/op and reintroduces the exact statistical noise -count and benchstat exist to eliminate. Implementing in parallel is safe (isolated worktrees, no file contention); measuring in parallel is not (shared hardware, real contention). Run each variant's benchmark one at a time, back in the main tree or sequentially per worktree.
Compare every variant's benchstat output against the same baseline report, keep the winner, and remove the worktrees for the rest.
Documenting Results in Commits
Paste benchstat output in the commit body when the change has a measurable performance impact. This documents why an optimization was made, prevents future readers from reverting it, and lets reviewers verify the claim without re-running benchmarks.
Commit format:
perf(parser): reduce Parse allocations 50% with sync.Pool
Replace per-call []byte allocation with a pooled buffer.
goos: linux / goarch: amd64 / cpu: AMD Ryzen 9 5950X
│ old │ new │
│ sec/op │ sec/op vs base │
Parse-32 4.592µ ± 2% 3.041µ ± 1% -33.78% (p=0.000 n=10)
│ old │ new │
│ B/op │ B/op vs base │
Parse-32 1.024Ki ± 0% 0.512Ki ± 0% -50.00% (p=0.000 n=10)
│ old │ new │
│ allocs/op │ allocs/op vs base │
Parse-32 12.00 ± 0% 6.000 ± 0% -50.00% (p=0.000 n=10)Rules:
Only include benchmarks directly affected by the change — strip unrelated rows
Never paste results with
~(no statistical significance) — the improvement cannot be claimedInclude the hardware context line (
goos/goarch/cpu) so results are reproducibleUse
perf(scope):commit type for performance-only changes
Profiling from Benchmarks
Generate profiles directly from benchmark runs — no HTTP server needed:
# CPU profile
go test -bench=BenchmarkParse -cpuprofile=cpu.prof ./pkg/parser
go tool pprof cpu.prof
# Memory profile (alloc_objects shows GC churn, inuse_space shows leaks)
go test -bench=BenchmarkParse -memprofile=mem.prof ./pkg/parser
go tool pprof -alloc_objects mem.prof
# Execution trace
go test -bench=BenchmarkParse -trace=trace.out ./pkg/parser
go tool trace trace.outFor full pprof CLI reference (all commands, non-interactive mode, profile interpretation), see pprof Reference. For execution trace interpretation, see Trace Reference. For statistical comparison, see benchstat Reference.
Reference Files
pprof Reference — Interactive and non-interactive analysis of CPU, memory, and goroutine profiles. Full CLI commands, profile types (CPU vs allocobjects vs inuse_space), web UI navigation, and interpretation patterns. Use this to dive deep into _where time and memory are being spent in your code.
benchstat Reference — Statistical comparison of benchmark runs with rigorous confidence intervals and p-value tests. Covers output reading, filtering old benchmarks, interleaving results for visual clarity, and regression detection. Use this when you need to prove a change made a meaningful performance difference, not just a lucky run.
Trace Reference — Execution tracer for understanding when and why code runs. Visualizes goroutine scheduling, garbage collection phases, network blocking, and custom span annotations. Use this when pprof (which shows where CPU goes) isn't enough — you need to see the timeline of what happened.
Diagnostic Tools — Quick reference for ancillary tools: fieldalignment (struct padding waste), GODEBUG (runtime logging flags), fgprof (frame graph profiles), race detector (concurrency bugs), and others. Use this when you have a specific symptom and need a focused diagnostic — don't reach for pprof if a simpler tool already answers your question.
Compiler Analysis — Low-level compiler optimization insights: escape analysis (when values move to the heap), inlining decisions (which function calls are eliminated), SSA dump (intermediate representation), and assembly output. Use this when benchmarks show allocations you didn't expect, or when you want to verify the compiler did what you intended.
CI Regression Detection — Automated performance regression gating in CI pipelines. Covers three tools (benchdiff for quick PR comparisons, cob for strict threshold-based gating, gobenchdata for long-term trend dashboards), noisy neighbor mitigation strategies (why cloud CI benchmarks vary 5-10% even on quiet machines), and self-hosted runner tuning to make benchmarks reproducible. Use this when you want to ensure pull requests don't silently slow down your codebase — detecting regressions early prevents shipping performance debt.
Investigation Session — Production performance troubleshooting workflow combining Prometheus runtime metrics (heap size, GC frequency, goroutine counts), PromQL queries to correlate metrics with code changes, runtime configuration flags (GODEBUG env vars to enable GC logging), and cost warnings (when you're hitting performance tax). Use this when production benchmarks look good but real traffic behaves differently.
Prometheus Go Metrics Reference — Complete listing of Go runtime metrics actually exposed as Prometheus metrics by
prometheus/client_golang. Covers 30 default metrics, 40+ optional metrics (Go 1.17+), process metrics, and common PromQL queries. Distinguishes betweenruntime/metrics(Go internal data) and Prometheus metrics (what you scrape from/metrics). Use this when setting up monitoring dashboards or writing PromQL queries for production alerts.
Cross-References
→ See
samber/cc-skills-golang@golang-performanceskill for optimization patterns to apply after measuring ("if X bottleneck, apply Y")→ See
samber/cc-skills-golang@golang-troubleshootingskill for pprof setup on running services (enable, secure, capture), Delve debugger, GODEBUG flags, root cause methodology→ See
samber/cc-skills-golang@golang-observabilityskill for everyday always-on monitoring, continuous profiling (Pyroscope), distributed tracing (OpenTelemetry)→ See
samber/cc-skills-golang@golang-testingskill for general testing practices→ See
samber/cc-skills@promql-cliskill for querying Prometheus runtime metrics in production to validate benchmark findings
Files
- ATTRIBUTION.mdAdded by AutoGineer905 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md13.5 KiB
- evals/evals.json91.2 KiB
- references/benchstat.md16.0 KiB
- references/ci-regression.md11.3 KiB
- references/compiler-analysis.md11.4 KiB
- references/investigation-session.md7.7 KiB
- references/pprof.md36.7 KiB
- references/prometheus-go-metrics.md12.9 KiB
- references/tools.md3.9 KiB
- references/trace.md19.7 KiB
references/ci-regression.md
CI Benchmark Regression Detection
Run these tools in CI only, not on local machines. Local benchmark results are noisy due to background processes, thermal throttling, and inconsistent CPU frequency — regressions detected locally are unreliable and waste developer time. Even shared CI runners can produce significant variance (5-10%); use statistical methods like
benchstatwith multiple iterations and relative comparisons to filter noise, or invest in dedicated benchmark runners for critical paths.
Table of Contents
benchdiff
cob
gobenchdata
CLI commands
GitHub Action setup
Regression gating on PRs
Dashboard configuration
Tool Selection Guide
Noisy Neighbor Mitigation
Why CI benchmarks are noisy
Strategies
System Tuning for Self-Hosted Runners
Disable CPU frequency scaling
Disable Turbo Boost
Pin benchmarks to specific CPU cores
Disable SMT (Hyper-Threading)
Combined CI setup script
benchdiff
Runs Go benchmarks on two git refs and uses benchstat to display deltas. Caches results for non-worktree refs so re-runs are fast. Prevents macOS sleep during benchmarks.
go install filippo.io/mostly-harmless/benchdiff@latest# Compare current worktree against HEAD (default)
benchdiff -- -benchmem
# Compare two specific refs
benchdiff -base-ref main -head-ref feature-branch
# Compare against a specific commit or tag
benchdiff -base-ref v1.2.0
# Pass extra flags to go test — everything after -- goes to go test
benchdiff -- -benchmem -count=10 -benchtime=3s
# Filter to specific benchmarks
benchdiff -- -benchmem -count=10 -bench=BenchmarkParse
# Target a specific package
benchdiff -- -benchmem -count=10 ./pkg/parser/...
# Clear cached results (useful after rebasing or when cache is stale)
benchdiff -clear-cache
# Combine: compare main with 10 iterations, filtered to critical benchmarks
benchdiff -base-ref main -- -benchmem -count=10 -bench='BenchmarkParse|BenchmarkEncode'Best for: quick PR-to-base comparisons in git-based workflows. Leverages benchstat for statistical rigor and caches non-worktree refs so re-runs only re-measure the worktree.
cob
Compares benchmarks between HEAD and HEAD~1, failing the CI job if performance degrades beyond a configurable threshold (default 20%).
go install github.com/knqyf263/cob@latest# Run with default 20% threshold — compares HEAD vs HEAD~1
cob
# Stricter threshold for critical paths (10% regression = failure)
cob -threshold 10
# Compare against a specific base commit
cob -base main
# Only report regressions (ignore improvements)
cob -only-degression
# Choose which metrics to compare (default: ns/op,B/op)
cob -compare "ns/op,B/op,allocs/op"
# Custom go test arguments
cob -bench-args "test -run '^$' -bench BenchmarkParse -benchmem ./pkg/parser/..."
# Increase benchmark duration for more stable results
cob -bench-args "test -run '^$' -bench . -benchmem -benchtime=3s ./..."
# Skip cob for a specific commit: include [skip cob] in commit messageCaution: cob uses git reset internally, which can cause data loss if uncommitted changes exist — always commit your work before running.
For safety, run only in CI pipelines, not locally.
cobrequires all benchmarks to pass; it skips CI gating if any benchmark fails.cobcompares single runs withoutbenchstat-style statistics, making it more susceptible to noise thanbenchdiff.
Best for: simple post-commit regression gating in CI where statistical rigor is less critical than fast feedback.
gobenchdata
GitHub Action + CLI that collects benchmark results, publishes to gh-pages as JSON, and visualizes with an interactive web dashboard. Shows performance trends over time.
go install go.bobheadxi.dev/gobenchdata@latestCLI commands
# Parse go test -bench output to JSON
go test -bench=. -benchmem -count=5 ./... | gobenchdata --json bench.json
# Parse from a file
gobenchdata --json bench.json < bench.txt
# Add a tag to the benchmark run (e.g., git commit)
gobenchdata --json bench.json --tag "$(git rev-parse --short HEAD)" < bench.txt
# Evaluate regression checks against a checks config
gobenchdata checks eval bench.txt --checks-config .gobenchdata-checks.yml
# Generate the web dashboard app (static Vue.js site)
gobenchdata web generate ./dashboard-app
# Serve the dashboard locally for preview
gobenchdata web serve ./dashboard-app
# Merge multiple benchmark JSON files
gobenchdata merge old-bench.json new-bench.json > combined.json
# Prune old entries (keep last 30 runs)
gobenchdata prune --count 30 bench.jsonGitHub Action setup
# .github/workflows/benchmark.yml
name: Benchmark
on: [push]
jobs:
benchmark:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: stable
- name: Run benchmarks
run: go test -bench=. -benchmem -count=5 ./... | tee bench.txt
- uses: bobheadxi/gobenchdata@v1
with:
PRUNE_COUNT: 30
GO_TEST_PKGS: ./...
BENCHMARKS_OUT: bench.txt
PUBLISH: true
PUBLISH_BRANCH: gh-pages
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Regression gating on PRs
- name: Check for regressions
run: gobenchdata checks eval bench.txt --checks-config .gobenchdata-checks.yml# .gobenchdata-checks.yml
checks:
- name: "No major regressions"
package: ./...
benchmarks: [".*"]
thresholds:
- metric: NsPerOp
max: 1.2 # fail if >20% slower
- metric: AllocedBytesPerOp
max: 1.3 # fail if >30% more allocations
- name: "Critical path stability"
package: ./pkg/parser
benchmarks: ["BenchmarkParse.*"]
thresholds:
- metric: NsPerOp
max: 1.1 # stricter: fail if >10% slowerDashboard configuration
# gobenchdata-web.yml — configure the Vue.js dashboard
title: "My Project Benchmarks"
description: "Performance tracking dashboard"
chartGroups:
- name: Parser
charts:
- name: Parse Performance
package: myapp/pkg/parser
benchmarks: ["BenchmarkParse.*"]
metrics: [NsPerOp, AllocedBytesPerOp, AllocsPerOp]
- name: Encoding
charts:
- name: Encode/Decode
package: myapp/pkg/encoding
benchmarks: ["Benchmark(Encode|Decode).*"]
metrics: [NsPerOp, MBPerS]Best for: long-term trend tracking and visualization; complements benchdiff/cob for immediate gating.
Tool Selection Guide
| Tool | Statistical rigor | Dashboard | Best for |
|---|---|---|---|
| benchdiff | High (uses benchstat) | No | Local dev + CI PR comparisons |
| cob | Low (single comparison) | No | Quick CI gate, simple setup |
| gobenchdata | Medium (configurable checks) | Yes (Vue.js on gh-pages) | Long-term trend tracking |
| benchstat (raw) | High | No (CSV export) | Maximum control, custom workflows |
Noisy Neighbor Mitigation
Cloud CI environments share hardware with other jobs. Expect 5-10% variance even on quiet machines.
Why CI benchmarks are noisy
Shared CPU/memory — other CI jobs compete for resources
Thermal throttling — sustained load reduces clock speed
Different hardware across runs — CI runners may have different specs
Kernel scheduling — context switches add unpredictable latency
Disk I/O contention — shared storage affects I/O-bound benchmarks
Strategies
Statistical rigor — run with -count=10 or more and compare with benchstat. A single run is meaningless. benchstat's p-value test filters out noise-induced false positives.
Relative comparison in same job — run both base and head benchmarks in the same CI job on the same machine, rather than comparing against historical absolute values. This cancels out machine-to-machine variation. Tools like benchdiff do this automatically by checking out both git refs.
Dedicated benchmark runners — for critical path benchmarks, use self-hosted CI runners with no other workloads. This eliminates noisy neighbors entirely but costs more infrastructure.
Conservative thresholds — set regression thresholds higher on shared CI (20%+) than on dedicated runners (10%). Tight thresholds on noisy environments produce false positives that erode trust. GitHub-hosted runners show ~2-3% coefficient of variation in the best case; to guarantee <1% false positive rate, you need a 7%+ performance gate.
Never "retry until pass" — rerunning benchmarks until they pass introduces selection bias. If a benchmark is flaky, fix the noise source (more iterations, dedicated runner, wider threshold) rather than retrying.
System Tuning for Self-Hosted Runners
WARNING: These commands modify kernel and CPU settings. Apply them ONLY on dedicated CI runners, NEVER on developer machines or shared servers.
When you control the CI hardware, these settings dramatically reduce benchmark variance by eliminating the main sources of non-determinism.
Disable CPU frequency scaling
Variable CPU frequency makes benchmark times meaningless — the same code runs at different speeds depending on load and thermals:
# Set all CPUs to "performance" governor (fixed maximum frequency)
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governorDisable Turbo Boost
Turbo Boost temporarily increases clock speed but throttles under sustained load, creating variance between the start and end of a benchmark run:
# Intel
echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo
# AMD
echo 0 | sudo tee /sys/devices/system/cpu/cpufreq/boostPin benchmarks to specific CPU cores
Prevents the OS from migrating the benchmark process across cores, which causes cache thrashing (L1/L2 caches are per-core):
# Pin to cores 2 and 3 (leave cores 0-1 for OS and other processes)
taskset -c 2,3 go test -bench=. -count=10 ./...Disable SMT (Hyper-Threading)
SMT shares execution units between logical cores on the same physical core, causing unpredictable contention:
# Disable SMT system-wide
echo off | sudo tee /sys/devices/system/cpu/smt/control
# Or disable individual sibling cores (check /sys/devices/system/cpu/cpu*/topology/thread_siblings_list)
echo 0 | sudo tee /sys/devices/system/cpu/cpu1/online # if cpu0 and cpu1 are siblingsCombined CI setup script
#!/bin/bash
# benchmark-setup.sh — run on self-hosted CI runner before benchmarks
set -euo pipefail
echo "=== Configuring CPU for stable benchmarks ==="
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo 2>/dev/null || true
echo off | sudo tee /sys/devices/system/cpu/smt/control 2>/dev/null || true
echo "=== Running benchmarks on isolated cores ==="
taskset -c 2,3 go test -bench=. -benchmem -count=10 ./... | tee bench.txtRequirements and compatibility
Written for: Claude Code, OpenAI Codex
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Declares allowed tools, Claude Code frontmatter
The author says: Designed for Claude Code, Codex or similar harness, and for projects using Golang.
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- samber
- Publisher
- Samuel Berthe (Community)
- Distributed by
- Samuel Berthe
- Source
- samber/cc-skills-golang · skills/golang-benchmark · commit bb1d43d
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by samber or Samuel Berthe.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download golang-benchmark.zip