返回顶部
g

golang-benchmarkGo基准测试

Golang benchmarking, profiling, and performance measurement. Use when writing, running, or comparing Go benchmarks, profiling hot paths with pprof, interpreting CPU/memory/trace profiles, analyzing results with benchstat, setting up CI benchmark regression detection, or investigating production performance with Prometheus runtime metrics. Also use when the developer needs deep analysis on a specific performance indicator - this skill provides the measurement methodology, while golang-performance

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.1.1
安全检测
已通过
148
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

golang-benchmark

角色定位: 你是一名 Go 性能测量工程师。你绝不会仅凭单次基准测试运行就下结论——在进行任何优化决策之前,统计严谨性和受控条件是先决条件。

思维模式: 在基准分析、性能剖析解读和性能比较任务中使用 ultrathink。深度推理可防止误解性能剖析数据,并确保得出统计上可靠的结论。

Go 基准测试与性能测量

没有度量就没有性能改进——如果你能度量它,你就能改进它。

本技能涵盖完整的测量工作流程:编写基准测试、运行它、对结果进行性能剖析、以统计严谨性比较前后结果,并在 CI 中跟踪回归。如需了解测量后应用的优化模式,→ 请参阅 samber/cc-skills-golang@golang-performance 技能。如需了解如何在运行中的服务上设置 pprof,→ 请参阅 samber/cc-skills-golang@golang-troubleshooting 技能。

编写基准测试

b.Loop() (Go 1.24+) — 推荐使用

b.Loop() 可防止编译器优化掉被测代码——没有它,编译器可能会检测到死结果并将其消除,从而产生具有误导性的快速数字。它还会自动将循环前的设置代码排除在计时之外。

go
func BenchmarkParse(b *testing.B) {
data := loadFixture(large.json) // 设置——排除在计时之外
for b.Loop() {
Parse(data) // 编译器无法消除此调用
}
}

现有的 for range b.N 基准测试仍然有效,但应迁移到 b.Loop()——旧模式需要手动调用 b.ResetTimer() 并使用包级别的 sink 变量来防止死代码消除。

内存跟踪

go
func BenchmarkAlloc(b *testing.B) {
b.ReportAllocs() // 或使用 -benchmem 标志运行
for b.Loop() {
_ = make([]byte, 1024)
}
}

b.ReportMetric() 用于添加自定义指标(例如,吞吐量):

go
b.ReportMetric(float64(totalBytes)/b.Elapsed().Seconds(), bytes/s)

子基准测试与表格驱动

go
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)
}
})
}
}

运行基准测试

bash
go test -bench=BenchmarkEncode -benchmem -count=10 ./pkg/... | tee bench.txt

标志用途
-bench=.运行所有基准测试(正则表达式过滤器)
-benchmem
报告内存分配情况(B/op, allocs/op) | | -count=10 | 运行 10 次以获得统计显著性 | | -benchtime=3s | 每个基准测试的最短运行时间(默认 1s) | | -cpu=1,2,4 | 使用不同的 GOMAXPROCS 值运行 | | -cpuprofile=cpu.prof | 写入 CPU 性能剖析文件 | | -memprofile=mem.prof | 写入内存性能剖析文件 | | -trace=trace.out | 写入执行跟踪文件 |

输出格式: BenchmarkEncode/size=64-8 5000000 230.5 ns/op 128 B/op 2 allocs/op — -8 后缀是 GOMAXPROCS,ns/op 是每次操作的时间,B/op 是每次操作分配的字节数,allocs/op 是每次操作的堆分配次数。

从基准测试进行性能剖析

直接从基准测试运行生成性能剖析文件——无需 HTTP 服务器:

bash

CPU 性能剖析


go test -bench=BenchmarkParse -cpuprofile=cpu.prof ./pkg/parser
go tool pprof cpu.prof

内存性能剖析(allocobjects 显示 GC 颠簸,inusespace 显示泄漏)

go test -bench=BenchmarkParse -memprofile=mem.prof ./pkg/parser go tool pprof -alloc_objects mem.prof

执行跟踪

go test -bench=BenchmarkParse -trace=trace.out ./pkg/parser go tool trace trace.out

有关完整的 pprof CLI 参考(所有命令、非交互模式、性能剖析解读),请参阅 pprof 参考。有关执行跟踪解读,请参阅 跟踪参考。有关统计比较,请参阅 benchstat 参考

参考文件

  • - pprof 参考 — CPU、内存和 goroutine 性能剖析的交互式和非交互式分析。包含完整的 CLI 命令、性能剖析类型(CPU vs alloc*objects vs inusespace)、Web UI 导航和解读模式。用于深入探究代码中时间和内存的具体消耗位置。
  • - benchstat 参考 — 使用严格的置信区间和 p 值测试对基准测试运行进行统计比较。涵盖输出读取、过滤旧基准测试、交错结果以获得视觉清晰度以及回归检测。当你需要证明某个更改产生了有意义的性能差异,而不仅仅是单次幸运运行时使用此工具。
  • - 跟踪参考 — 用于理解代码运行时间原因的执行跟踪器。可视化 goroutine 调度、垃圾回收阶段、网络阻塞和自定义 span 注释。当 pprof(显示 CPU 消耗位置)不够用时——你需要查看事件发生的时间线时使用此工具。
  • - 诊断工具 — 辅助工具的快速参考:fieldalignment(结构体填充浪费)、GODEBUG(运行时日志标志)、fgprof(帧图性能剖析)、竞态检测器(并发错误)等。当你有特定症状并需要针对性诊断时使用——如果更简单的工具已经能回答你的问题,则无需使用 pprof。
  • - 编译器分析 — 底层编译器优化洞察:逃逸分析(值何时移至堆)、内联决策(哪些函数调用被消除)、SSA 转储(中间表示)和汇编输出。当基准测试显示了你未预期的内存分配,或者你想验证编译器是否按你的意图执行时使用此工具。
  • - CI 回归检测 — CI 流水线中的自动化性能回归门控。涵盖三种工具(用于快速 PR 比较的 benchdiff、用于严格阈值门控的 cob、用于长期趋势仪表板的 gobenchdata)、嘈杂邻居缓解策略(为什么即使在安静的机器上,云 CI 基准测试也会有 5-10% 的差异)以及使基准测试可重现的自托管运行器调优。当你希望确保拉取请求不会悄悄拖慢你的代码库时使用——及早检测回归可以避免交付性能债务。
  • - 调查会话 — 结合 Prometheus 运行时指标(堆大小、GC 频率、goroutine 计数)、用于将指标与代码变更关联的 PromQL 查询、运行时配置标志(启用 GC 日志的 GODEBUG 环境变量)和成本警告(当你遇到性能税时)的生产性能故障排除工作流程。当生产环境基准测试看起来不错但实际流量表现不同时使用此工具。
  • - Prometheus Go 指标参考 — 由 prometheus/clientgolang 实际作为 Prometheus 指标暴露的 Go 运行时指标的完整列表。涵盖 30 个默认指标、40+ 个可选指标(Go 1.17+)、进程指标和常见 PromQL 查询。区分 runtime/metrics(Go 内部数据)和 Prometheus 指标(从 /metrics 抓取的数据)。当设置监控仪表板或为生产告警编写 PromQL 查询时使用此工具。

交叉引用

  • - → 请参阅 samber/cc-skills-golang@golang-performance 技能,了解测量后应用的优化模式(“如果 X 是瓶颈,则应用 Y”)
  • → 请参阅 samber/cc-skills-golang@golang-troubleshooting 技能,了解如何在运行中的服务上设置 pprof(启用、安全、捕获)、Delve 调试器、GODEBUG 标志、根本原因方法论
  • → 请参阅 samber/cc-skills-golang@golang-observability 技能,了解日常始终在线的监控、持续性能剖析(Pyroscope)、分布式追踪(OpenTelemetry)
  • → 请参阅 samber/cc-skills-golang@golang-testing 技能,了解通用测试实践
  • → 请参阅 samber/cc-skills@promql

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 golang-benchmark-1776093904 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 golang-benchmark-1776093904 技能

通过命令行安装

skillhub install golang-benchmark-1776093904

下载

⬇ 下载 golang-benchmark v1.1.1(免费)

文件大小: 65.01 KB | 发布时间: 2026-4-14 13:11

v1.1.1 最新 2026-4-14 13:11
- Bumped version from 1.1.0 to 1.1.1 in metadata.
- No functional or content changes outside of the version update.

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部