Golang基准测试Benchmark Test的基本写法
技术百科
P粉602998670
发布时间:2026-01-24
浏览: 次 Go基准测试函数名必须以Benchmark开头,定义在_test.go文件中,仅接收*testing.B参数且无返回值,主体需用b.N循环并调用b.ResetTimer()。
Go基准测试函数名必须以Benchmark开头
Go的 testing包只识别形如BenchmarkXXX的函数为基准测试,且必须接收*testing.B参数。名字不满足规则(比如写成TestBenchmark或benchFoo)会导致go test -ben完全忽略该函数。
常见错误:把基准测试和普通单元测试混写在同一文件但没注意命名规范,结果-bench=.跑出来是no benchmarks to run。
- 函数必须定义在
_test.go文件中 - 首字母大写的
XXX部分建议体现被测逻辑,例如BenchmarkMapInsert、BenchmarkJSONMarshal - 不能有返回值,也不能额外参数(仅
*testing.B)
基准测试主体必须调用b.N循环
*testing.B的b.N不是固定次数,而是由Go测试框架根据预热和稳定性自动确定的迭代次数。你必须在b.ResetTimer()之后、实际测量代码里显式使用for i := 0; i 包裹待测逻辑,否则测的是0次或1次,结果无意义。
容易踩的坑:直接在循环外执行一次操作,或者用b.ReportAllocs()但忘了加循环——这时b.N可能是1,所有耗时/内存数据都失真。
- 不要手动设
b.N = 10000,它会被框架覆盖 - 耗时敏感的操作(如初始化开销大的对象)应放在
b.ResetTimer()之前 - 如果要排除某段预处理时间,用
b.StopTimer()和b.StartTimer()控制计时区间
运行基准测试必须加-bench参数
go test默认不运行任何Benchmark函数,必须显式传参。最常用的是go test -bench=.(点号表示匹配所有),也可以用正则精确指定,比如go test -bench=BenchmarkJSON。
注意:-bench会自动启用-cpuprofile等底层支持,但不会运行Test函数——除非同时加-run。这点常被忽略,导致误以为“基准测试失败”其实是没跑起来。
- 加
-benchmem可同时显示内存分配统计(推荐必加) - 加
-benchtime=5s可延长总运行时间,让结果更稳定(默认1秒) - 加
-count=3可重复运行三次取平均值,避免单次抖动干扰
func BenchmarkAdd(b *testing.B) {
var x, y = 1, 2
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = x + y
}
}
这个例子看起来简单,但漏掉b.ResetTimer()或没用b.N循环,就不是有效的基准测试。真实场景中,初始化DB连接、构建大结构体、预热缓存这些动作,都需要仔细安排在计时开关之间。
# 的是
# 放在
# 排在
# 可以用
# 是由
# 你必须
# 就不
# 能有
# js
# json
# go
# golang
# 循环
# 对象
# 结构体
# 返回值
# for
# count
# 跑出
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- 如何解决同一段404代码在不同主机上表现不一致的问
- PHP 中如何在函数内持久化修改引用变量的指向
- Mac如何备份到iCloud_Mac桌面与文稿文件
- c++怎么处理多线程死锁_c++ lock_gua
- 如何使用Golang匿名函数_快速定义临时函数逻辑
- LINUX怎么设置系统语言_LINUX修改中文环境
- php修改数据怎么批量改状态_批量更新status
- 如何在Golang中处理JSON字段缺失_Gola
- Windows如何查看和管理已安装的字体?(字体文
- php8.4xdebug无法调试怎么办_php8.
- 如何在 Go 中创建包含映射(map)的切片(sl
- Win10怎么创建桌面快捷方式 Win10为应用创
- c++中的std::conjunction和std
- c++如何打印函数堆栈信息_c++ backtra
- Windows10如何重置此电脑_Windows1
- c++中如何计算坐标系中两点间距离_c++勾股定理
- 本地php环境打开php文件直接下载_浏览器解析p
- php下载安装后swoole扩展怎么安装_异步框架
- Win11怎么设置按流量计费_Win11限制后台流
- 如何在 Laravel 中通过嵌套关联关系进行 o
- Win11怎么关闭搜索历史_Win11清除设备上的
- Python并发安全问题_资源竞争说明【指导】
- php订单日志怎么记录物流_php记录订单物流变更
- Win11怎么用设置清理回收站_Win11设置清理
- 如何减少Golang内存碎片化_Golang内存分
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- 如何在Golang中实现微服务服务拆分_Golan
- Win11怎么设置快速访问_Windows11文件
- c++ stringstream用法详解_c++字
- Win11怎么打开注册表_Windows 11注册
- php中::能访问全局变量吗_全局作用域与类作用域
- LINUX下如何配置VLAN虚拟局域网_在LINU
- 如何用::实现工具类方法调用_php静态工具类设计
- php485支持哪些操作系统_php485跨系统支
- 如何在 Go 中创建包含 map 的 slice(
- Win11开机速度慢怎么优化_Win11系统启动加
- Win11怎么关闭触摸键盘图标_Windows11
- Win11怎么连接投影仪_Win11多显示器投屏设
- c++ try_emplace用法_c++ map
- Win10怎样清理C盘爱奇艺缓存_Win10清理爱
- Win11如何设置系统语言_Win11系统语言切换
- php增删改查在php8里有什么变化_新特性对cu
- Windows10系统怎么查看运行时间_Win10
- 如何处理“XML格式不正确”错误 常见XML we
- c++怎么使用类型萃取type_traits_c+
- 如何使用Golang模拟请求超时_Golang c
- Win11怎么更改任务栏位置_修改注册表将Win1
- Windows10如何查看蓝屏日志_Win10使用
- C++如何编写函数模板?(泛型编程入门)

QQ客服