17-第17章-性能测试与基准测试

张开发
2026/4/6 7:17:23 15 分钟阅读

分享文章

17-第17章-性能测试与基准测试
第17章性能测试与基准测试17.1 Go 测试框架17.1.1 基础测试packagedatabaseimporttestingfuncTestInit(t*testing.T){err:Init(./testdb,false,,)iferr!nil{t.Fatalf(Failed to init database: %v,err)}}funcTestQueryRecords(t*testing.T){records,err:QueryRecords(Table,TestDevice,,)iferr!nil{t.Fatalf(Failed to query records: %v,err)}t.Logf(Got %d records,len(records))}17.1.2 子测试funcTestBatchInsert(t*testing.T){tests:[]struct{namestringbatchSizeint}{{small,10},{medium,100},{large,1000},}for_,tt:rangetests{t.Run(tt.name,func(t*testing.T){records:generateTestRecords(tt.batchSize)err:BatchInsertWithRetry(Table,records,3,time.Second)iferr!nil{t.Fatalf(Batch insert failed: %v,err)}})}}17.2 基准测试17.2.1 基准测试基础funcBenchmarkQueryRecords(b*testing.B){b.ResetTimer()fori:0;ilt;b.N;i{_,_QueryRecords(Table,TestDevice,,)}}funcBenchmarkBatchInsert(b*testing.B){records:generateTestRecords(100)b.ResetTimer()fori:0;ilt;b.N;i{_BatchInsertWithRetry(Table,records,3,time.Second)}}17.2.2 运行基准测试# 运行基准测试gotest-bench.-benchmem# 运行特定基准测试gotest-benchBenchmarkQueryRecords-benchmem# 运行更长时间gotest-bench.-benchtime10s-benchmem17.2.3 基准测试输出解读BenchmarkQueryRecords-8 10000 123456 ns/op 4567 B/op 12 allocs/opBenchmarkQueryRecords-8测试名称和 GOMAXPROCS10000运行次数123456 ns/op每次操作纳秒数4567 B/op每次操作分配字节数12 allocs/op每次操作分配次数17.3 性能分析工具17.3.1 pprofimport_net/http/pproffuncmain(){gofunc(){log.Println(http.ListenAndServe(localhost:6060,nil))}()// 主程序逻辑}# 收集 CPU profilego tool pprof http://localhost:6060/debug/pprof/profile?seconds30# 收集内存 profilego tool pprof http://localhost:6060/debug/pprof/heap# 收集 goroutine profilego tool pprof http://localhost:6060/debug/pprof/goroutine17.3.2 pprof 交互命令top10 # 显示前10个函数 list function # 显示函数代码 web # 生成调用图需要 graphviz png # 生成 PNG 图片17.3.3 trace 工具importruntime/tracefuncmain(){f,err:os.Create(trace.out)iferr!nil{log.Fatal(err)}deferf.Close()trace.Start(f)defertrace.Stop()// 主程序逻辑}# 运行并生成 tracegotest-tracetrace.out# 查看 tracego tool trace trace.out17.4 负载测试17.4.1 编写负载测试packagemainimport(net/httpsynctime)funcmain(){varwg sync.WaitGroup client:amp;http.Client{Timeout:10*time.Second,}requestCount:1000concurrency:10semaphore:make(chanstruct{},concurrency)startTime:time.Now()fori:0;ilt;requestCount;i{wg.Add(1)semaphorelt;-struct{}{}gofunc(){deferwg.Done()deferfunc(){lt;-semaphore}()resp,err:client.Get(http://localhost:8081/api/readings?deviceNameTestDevice)iferr!nil{log.Printf(Request failed: %v,err)return}deferresp.Body.Close()}()}wg.Wait()duration:time.Since(startTime)log.Printf(Requests: %d,requestCount)log.Printf(Duration: %v,duration)log.Printf(RPS: %.2f,float64(requestCount)/duration.Seconds())}17.5 实战练习练习 17.1基准测试为数据库模块编写完整的基准测试。练习 17.2性能分析使用 pprof 分析系统瓶颈并优化。练习 17.3负载测试设计并运行负载测试找出系统最大吞吐量。17.6 本章小结本章讲解了性能测试和基准测试Go 测试框架使用基准测试编写和运行pprof 性能分析trace 工具使用负载测试设计持续的性能测试是保持系统高性能的关键。本书版本1.0.0最后更新2026-03-08sfsEdgeStore- 让边缘数据存储更简单技术栈- Go语言、sfsDb与EdgeX Foundry。纯golang工业物联网边缘计算技术栈项目地址GitHubGitCode 镜像GitCode

更多文章