如何备份网站 整站,阿里云企业建站教程,h5页面设计模板,去掉/wordpress一、什么是基准测试#xff08;Benchmark#xff09;
在 Go 中#xff0c;基准测试是通过创建以 Benchmark 开头的函数#xff0c;并接收一个 *testing.B 类型的参数来实现的。testing.B 提供了控制基准测试执行的接口#xff0c;比如设置测试执行的次数、记录每次执行的…一、什么是基准测试Benchmark
在 Go 中基准测试是通过创建以 Benchmark 开头的函数并接收一个 *testing.B 类型的参数来实现的。testing.B 提供了控制基准测试执行的接口比如设置测试执行的次数、记录每次执行的时间等。
每个基准测试函数都必须接受一个 *testing.B 类型的参数。函数体内通过 b.N来控制基准测试的执行次数Go 会自动调整 b.N 的值确保每次基准测试运行的时间足够长。
例如
package mainimport (testing
)// 基准测试函数
func BenchmarkMyFunction(b *testing.B) {// 这里是测试的代码每次循环 b.N 次for i : 0; i b.N; i {// 被测试的函数或代码块_ hello}
}
二、怎么进行基准测试
要运行基准测试可以使用 go test 命令指定 -bench 标志来启动基准测试。
go test -bench .bench .表示运行当前目录下所有以 Benchmark 开头的函数。bench pattern 可以通过提供正则表达式来运行特定的基准测试比如 go test -bench BenchmarkMyFunction 仅运行 BenchmarkMyFunction。
运行基准测试并报告内存分配
go test -bench . -benchmembenchmem该标志会显示内存分配的详细信息包括每次基准测试中分配了多少内存。
package mainimport (testingunsafe
)func BenchmarkBytes2Str(b *testing.B) {aa : []byte(mclink)for n : 0; n b.N; n {Bytes2Str(aa)}
}
func BenchmarkBytes2StrUnsafe(b *testing.B) {aa : []byte(mclink)for n : 0; n b.N; n {Bytes2StrUnsafe(aa)}
}func Bytes2Str(b []byte) string {return string(b)
}func Bytes2StrUnsafe(b []byte) string {return *(*string)(unsafe.Pointer(b))
} #从左到右分别表示benchmark函数、运行次数、单次运行消耗的时间、单次运行内存分配的字节数和次数
BenchmarkBytes2Str-8 :基准测试的名称和 CPU 核心数量这里 -8 表示在 8 核 CPU 上运行。 317858601:测试函数执行了 20,000,000 次。 3.720 ns/op:每次执行 BenchmarkBytes2Str-8 的平均耗时为 3.72 纳秒。 0 B/op每次测试没有内存分配。 0 allocs/op每次测试没有进行内存分配。
三、复杂的基准测试
有时在基准测试中某些初始化工作并不应该计入测试时间。可以使用 b.StartTimer() 和 b.StopTimer() 来控制计时开始和结束。
func BenchmarkWithStartStopTimer(b *testing.B) {// 1. 先进行一些初始化工作setup()// 2. 在基准测试前停止计时这部分不会计入基准测试时间b.StopTimer()// 3. 进行某些准备工作或其他代码这部分不会计入基准测试时间time.Sleep(100 * time.Millisecond)// 4. 启动计时开始计入基准测试时间b.StartTimer()// 5. 开始基准测试for i : 0; i b.N; i {performWork()}// 6. 结束时停止计时b.StopTimer()
}
b.StartTimer()开始计时。b.StopTimer()停止计时。b.ResetTimer()重置计时器确保计时仅限于你关心的代码
你可以使用 b.ReportAllocs() 启用内存报告来查看每次基准测试中分配了多少内存。
func BenchmarkAllocations(b *testing.B) {b.ReportAllocs() // 启用内存分配报告for i : 0; i b.N; i {_ make([]byte, 1024) // 模拟内存分配}
}通过 -benchtime 设置基准测试时间 go test 命令支持 -benchtime 标志可以控制基准测试的执行时长。例如如果你想要让基准测试执行 2 秒钟
go test -bench . -benchtime2s跳过普通单元测试只运行基准测试 如果你只想运行基准测试而跳过普通的单元测试可以使用 -run^$ 来过滤单元测试
go test -bench . -run^$和pprof 混合双打
package mainimport (fmttestingtimeruntime/pprofos
)// 需要进行基准测试的函数
func performTask() {// 模拟耗时操作time.Sleep(100 * time.Millisecond)
}// 基准测试函数
func BenchmarkWithPprof(b *testing.B) {// 创建一个文件来保存 CPU 分析数据f, err : os.Create(cpu.pprof)if err ! nil {b.Fatal(could not create CPU profile: , err)}defer f.Close()// 启动 pprof开始记录 CPU 使用情况if err : pprof.StartCPUProfile(f); err ! nil {b.Fatal(could not start CPU profile: , err)}defer pprof.StopCPUProfile()// 进行基准测试for i : 0; i b.N; i {performTask()}
}// 运行基准测试的命令go test -bench .
// 运行完之后会生成一个 cpu.pprof 文件可以用 go tool pprof 查看分析数据。
如何使用 pprof 请看上一篇文章。
下一篇Go的 Trace 工具