0

0

如何使用Golang进行压力测试_Golang Benchmark压力测试实践

P粉602998670

P粉602998670

发布时间:2026-01-03 12:19:37

|

895人浏览过

|

来源于php中文网

原创

Go 的 Benchmark 函数必须命名为 BenchmarkXXX(*testing.B),调用 b.N 循环执行被测逻辑,初始化代码置于 b.ResetTimer() 前,调用 b.ReportAllocs() 获取内存分配统计。

如何使用golang进行压力测试_golang benchmark压力测试实践

Go 自带的 testing 包支持基准测试(Benchmark),不需要额外安装工具,但必须理解它不是模拟并发用户请求的“压测”,而是测量单个函数在受控条件下的执行性能。

如何写一个合法的 Benchmark 函数

Go 的 go test 只识别形如 BenchmarkXXX(*testing.B) 的函数。它和普通测试函数不同:不能用 t.Fatal,必须调用 b.N 控制循环次数,且被测逻辑需放在 b.ResetTimer()b.ReportAllocs() 附近以排除初始化干扰。

  • b.N 是框架自动调整的迭代次数,不是你手动指定的“跑 1000 次”——它会根据首次运行耗时动态扩增,确保总耗时稳定在 1 秒左右
  • 若被测逻辑含初始化开销(如建 map、读配置),应把初始化放在 b.ResetTimer() 之前,否则会污染结果
  • b.ReportAllocs() 才能在结果中看到内存分配统计(B/opallocs/op
func BenchmarkAdd(b *testing.B) {
    b.ReportAllocs()
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        _ = add(1, 2)
    }
}

运行 benchmark 并解读关键指标

go test -bench=. 运行,默认只显示耗时(ns/op)。加上 -benchmem 才显示内存数据;加上 -count=3 可跑多次取平均值,避免单次抖动影响判断。

  • 输出中 1000000000 表示跑了 10 亿次,1.23 ns/op 是每次平均耗时——数值越小越好
  • 2 B/op 表示每次调用分配了 2 字节内存,0 allocs/op 表示没触发堆分配——这对高频函数很关键
  • 如果看到 500000000 3.45 ns/op,说明函数较慢,Go 自动减少了 b.N 次数来保证单轮不超时

为什么 Benchmark 不能替代真实压测

testing.B 是单 goroutine 循环调用,不涉及网络、I/O 等阻塞操作,也不模拟多客户端并发竞争资源。它测的是“理想路径下函数的纯 CPU 性能”。比如:

讯飞绘文
讯飞绘文

讯飞绘文:免费AI写作/AI生成文章

下载

立即学习go语言免费学习笔记(深入)”;

  • json.Marshal 可以,但测 HTTP handler 不行——handler 里有 net/http 的调度、TLS 握手、连接复用等不可控变量
  • sync.Map.Load 有意义,但测整个 API 接口的 QPS 就会严重高估——实际瓶颈往往在数据库连接池或锁争用上
  • 若想模拟 1000 并发请求,得用 abheyvegeta 这类外部工具打真实 endpoint

常见陷阱:误用 Benchmark 导致结果失真

最容易踩的坑是让编译器优化掉被测逻辑,或者把副作用留在循环外。

  • 写成 result := add(1,2); for i:=0; i → 整个循环被优化为空,结果是 0 ns/op,毫无意义
  • 忘记加 _ = 或用 result,导致 Go 认为返回值未使用而内联/消除调用
  • 在循环里做 I/O(如 fmt.Println)或 sleep → 结果反映的是系统调用耗时,不是函数本身性能
  • time.Now() 手动计时 → 绕过 testing.B 的自适应机制,且纳秒级时间获取本身有开销

真正要定位线上性能瓶颈,得先用 pprof 抓 CPU profile,再针对 hot path 写精准 benchmark;盲目对整个 handler 跑 benchmark,往往只验证了“这段代码确实挺快”,却掩盖了真正的慢点。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

225

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

漫画合集pdf网盘入口_漫画解说合集一口气看完
漫画合集pdf网盘入口_漫画解说合集一口气看完

精选高人气漫画合集PDF,一站式网盘入口直达!深度漫画解说整合,一口气看完经典与新作,剧情梳理清晰,省时省力,追漫党必看合集。

3

2026.01.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.1万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号