Go进阶之性能测试原理
1.数据结构:源码位置:src/testing/benchmark.go:Btype B struct { common importPath string // import path of the package containing the benchmark bstate *benchState N int previousN int // number of iterations in the previous run previousDuration time.Duration // total duration of the previous run benchFunc func(b *B) benchTime durationOrCountFlag bytes int64 missingBytes bool // one of the subbenchmarks does not have bytes set. timerOn bool showAllocResult bool result BenchmarkResult parallelism int // RunParallel creates parallelism*GOMAXPROCS goroutines // The initial states of memStats.Mallocs and memStats.TotalAlloc. startAllocs uint64 startBytes uint64 // The net total of this test after being run. netAllocs uint64 netBytes uint64 // Extra metrics collected by ReportMetric. extra map[string]float64 // For Loop() to be executed in benchFunc. // Loop() has its own control logic that skips the loop scaling. // See issue #61515. loopN int }1).基础标识与调度:importPath:包导入路径.bstate:状态测试管理器.benchFunc:测试函数.2).循环控制:N:循环执行次数.previousN:上一轮循环次数.loopN:loop专用循环数.3).耗时统计:benchTime:测试目标耗时. 控制基准测试的最小总耗时默认 1s可通过-benchtime调整如-benchtime5s或-benchtime100x)previousDuration:上一轮总耗时.timerOn:计时器开关.4).内存或字节统计:bytes:每次迭代处理的字节数.missingBytes:测试字节数缺失标记.startAllocs:内存分布次数初始值.startBytes:内存分配字节初始值.netAllocs:总分配次数.netBytes:总分配字节数.5).并行控制:parallelism:并行度.6).结果与输出:result:基准测试结果.showAllocResult:内存结果显示标记.extra:自定义指标.7).通用能力:common:通用测试能力.2.启动计时.B.StartTimer():源码位置:src/testing/benchmark.gofunc (b *B) StartTimer() { if !b.timerOn { runtime.ReadMemStats(memStats) b.startAllocs memStats.Mallocs b.startBytes memStats.TotalAlloc b.start highPrecisionTimeNow() b.timerOn true } }StartTimer()负责启动计时并初始化内存相关计数.测试执行时会自动调用.一般不需要用户启动.流程图:3.停止计时.B.StopTimer():源码位置:src/testing/benchmark.goStopTimer()负责停止计时.并累加相应的值.// StopTimer stops timing a test. This can be used to pause the timer // while performing steps that you dont want to measure. func (b *B) StopTimer() { if b.timerOn { b.duration highPrecisionTimeSince(b.start) runtime.ReadMemStats(memStats) b.netAllocs memStats.Mallocs - b.startAllocs b.netBytes memStats.TotalAlloc - b.startBytes b.timerOn false } }需要注意的是.StopTimer()并不一定是测试结束.一个测试中有可能有多个统计阶段.所以统计值是累加的.流程图:4.重置计时.B.ResetTimer():ResetTimer()用于重置计时器.相应的也会把其他统计值也重置.源码位置:src/testing/benchmark.go// ResetTimer zeroes the elapsed benchmark time and memory allocation counters // and deletes user-reported metrics. // It does not affect whether the timer is running. func (b *B) ResetTimer() { if b.extra nil { // Allocate the extra map before reading memory stats. // Pre-size it to make more allocation unlikely. b.extra make(map[string]float64, 16) } else { clear(b.extra) } if b.timerOn { runtime.ReadMemStats(memStats) b.startAllocs memStats.Mallocs b.startBytes memStats.TotalAlloc b.start highPrecisionTimeNow() } b.duration 0 b.netAllocs 0 b.netBytes 0 }流程图:5.SetBytes():源码位置:src/testing/benchmark.go// SetBytes records the number of bytes processed in a single operation. // If this is called, the benchmark will report ns/op and MB/s. func (b *B) SetBytes(n int64) { b.bytes n }流程图:核心公式:// 总处理字节数 单次迭代字节数 × 总迭代次数totalBytes b.bytes × b.N// 总耗时秒 总有效耗时纳秒 / 10^9totalSeconds b.duration / 1e9// 吞吐量MB/s 总处理字节数MB / 总耗时秒// 注1MB 1024×1024 1048576 字节throughputMBps (totalBytes / 1048576) / totalSeconds测试代码:func BenchmarkSetBytes(b *testing.B) { b.SetBytes(1024 * 1024) for i : 0; i b.N; i { time.Sleep(1 * time.Second) } }执行结果:6.runN():源码位置:src/testing/benchmark.go// runN runs a single benchmark for the specified number of iterations. func (b *B) runN(n int) { benchmarkLock.Lock() defer benchmarkLock.Unlock() ctx, cancelCtx : context.WithCancel(context.Background()) defer func() { b.runCleanup(normalPanic) b.checkRaces() }() // Try to get a comparable environment for each run // by clearing garbage from previous runs. runtime.GC() b.resetRaces() b.N n b.loopN 0 b.ctx ctx b.cancelCtx cancelCtx b.parallelism 1 b.ResetTimer() b.StartTimer() b.benchFunc(b) b.StopTimer() b.previousN n b.previousDuration b.duration }流程图:7.内存统计:源码位置:src/testing/benchmark.go// BenchmarkResult contains the results of a benchmark run. type BenchmarkResult struct { N int // The number of iterations. T time.Duration // The total time taken. Bytes int64 // Bytes processed in one iteration. MemAllocs uint64 // The total number of memory allocations. MemBytes uint64 // The total number of bytes allocated. // Extra records additional metrics reported by ReportMetric. Extra map[string]float64 }N:最终执行的迭代次数.T:总耗时.Bytes:单词迭代处理的字节数.MemAllocs:总内存分配次数.MemBytes:总内存分配字节数.Extra:自定义性能指标.生成流程(关联runN):AllocsPerOp()函数:// AllocsPerOp returns the allocs/op metric, // which is calculated as r.MemAllocs / r.N. func (r BenchmarkResult) AllocsPerOp() int64 { if v, ok : r.Extra[allocs/op]; ok { return int64(v) } if r.N 0 { return 0 } return int64(r.MemAllocs) / int64(r.N) }流程图:AllocedBytesPerOp()函数:// AllocedBytesPerOp returns the B/op metric, // which is calculated as r.MemBytes / r.N. func (r BenchmarkResult) AllocedBytesPerOp() int64 { if v, ok : r.Extra[B/op]; ok { return int64(v) } if r.N 0 { return 0 } return int64(r.MemBytes) / int64(r.N) }流程图:语雀地址https://www.yuque.com/itbosunmianyi/xg8vfe?《Go.》 密码xbkk 欢迎大家访问.提意见.岁月悠悠.如果大家喜欢我的分享的话.可以关注我的微信公众号念何架构之路

相关新闻

格式总出错?千笔·专业论文写作工具,实力封神的AI论文软件

格式总出错?千笔·专业论文写作工具,实力封神的AI论文软件

你是否曾在论文写作中感到力不从心?选题无头绪、框架混乱、文献查找困难、格式反复出错、查重率居高不下……这些困扰着无数专科生的难题,是否让你在深夜里辗转反侧?别再让论文成为你毕业路上的绊脚石。千笔AI,一款专为学生打造的…

2026/7/5 6:01:34 阅读更多 →
拖延症福音 10个AI论文写作软件测评:自考毕业论文+开题报告必备工具推荐

拖延症福音 10个AI论文写作软件测评:自考毕业论文+开题报告必备工具推荐

在当前学术研究与论文写作日益数字化的背景下,越来越多的学生和研究人员开始依赖AI工具来提升效率。尤其是自考群体,在面对毕业论文和开题报告时,常常面临时间紧张、思路混乱、格式不规范等难题。为了解决这些痛点,笔者基于2026年…

2026/7/6 17:16:18 阅读更多 →
交稿前一晚!AI论文软件 千笔ai写作 VS 锐智 AI,研究生高效写作神器!

交稿前一晚!AI论文软件 千笔ai写作 VS 锐智 AI,研究生高效写作神器!

随着人工智能技术的迅猛发展,AI辅助写作工具已逐渐成为高校学生完成毕业论文的重要帮手。无论是开题报告、文献综述还是整篇论文的撰写,越来越多的学生开始借助AI工具提升效率、优化内容质量。然而,在功能繁多、定位各异的市场环境中&#xf…

2026/7/3 20:46:15 阅读更多 →

最新新闻

AI视频生成技术在游戏特效制作中的应用实践

AI视频生成技术在游戏特效制作中的应用实践

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 这次我们来看一个基于AI视频生成技术的"恐惧魔王 吞噬魔法"特效测试项目。这个项目展示了如何利用AI技术实现游戏角色特效的…

2026/7/7 2:40:13 阅读更多 →
本地AI部署实战指南:从环境配置到性能优化的完整解决方案

本地AI部署实战指南:从环境配置到性能优化的完整解决方案

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 今天我们来聊聊一个让很多开发者头疼的问题:本地AI部署。虽然标题提到了"一人公司"的困境,但本文重…

2026/7/7 2:38:12 阅读更多 →
Claude偷改了你一行代码

Claude偷改了你一行代码

摘要:2026 年 6 月底,Reddit 开发者逆向 Claude Code 客户端,发现 Anthropic 用隐写术在中国用户请求里嵌入隐藏标记——读系统时区、比对 147 个加密域名、在日期字符串里替换 Unicode 字符。这段代码静默运行三个月,从未披露。三…

2026/7/7 2:36:12 阅读更多 →
面向AI应用的后端架构设计:协议选型、服务治理与可观测性

面向AI应用的后端架构设计:协议选型、服务治理与可观测性

引言:AI应用的后端挑战与传统架构的差异 在AI应用从概念验证走向生产部署的过程中,后端架构面临的挑战与传统互联网应用有本质差异。传统后端系统追求的是低延迟、高吞吐、确定性响应,而AI应用的核心瓶颈往往不在业务逻辑,而在于…

2026/7/7 2:36:12 阅读更多 →
[实战]Python爬取全国考研数据与可视化(附源码)

[实战]Python爬取全国考研数据与可视化(附源码)

很多考研同学都会关注院校招生人数、专业分数线等信息,手动整理效率极低。本篇用 Python 完成接 口爬虫 数据存储 可视化分析全流程实战,从考研网站抓取院校专业数据,再通过图表直观分析数据,适合爬虫、数据分析入门学习。 一、…

2026/7/7 2:36:12 阅读更多 →
ComfyUI整合包+KREA2模型:AI绘画本地部署全攻略

ComfyUI整合包+KREA2模型:AI绘画本地部署全攻略

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在为AI绘画的复杂环境配置而头疼,特别是想要体验最新的KREA2模型却苦于繁琐的安装过程,那么萝卜大佬的…

2026/7/7 2:34:11 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻