benchmark介绍
基准测试主要是通过测试CPU和内存的效率问题,来评估被测试代码的性能,进而找到更好的解决方案。 而Go语言中自带的benchmark则是一件非常神奇的测试利器。有了它,开发者可以方便快捷地在测试一个函数方法在串行或并行环境下的基准表现。指定一个时间(默认是1秒),看测试对象在达到或超过时间上限时,最多能被执行多少次和在此期间测试对象内存分配情况。
1.基准测试代码文件必须是_test.go结尾,和单元测试一样; 2.基准测试的函数以Benchmark开头; 3.参数须为 *testing.B; 4.基准测试函数不能有返回值; 5.b.ResetTimer是重置计时器,这样可以避免for循环之前的初始化代码的干扰; 6.b.StopTimer()停止计时器 7.b.N是基准测试框架提供的,Go会根据系统情况生成,不用用户设定,表示循环的次数,因为需要反复调用测试的代码,才可以评估性能;
benchmark运行
go test -bench=. -benchmem 输出解释: 函数名后面的-8,表示运行时对应的 GOMAXPROCS 的值; 1:代表循环次数 9581522041:代表执行花费时间 (越少越好) 5559464 B/op :代表分配了多少字节内存(越少越好) 20522 allocs/op:代表发生了多少次不同的内存分配(越少越好)

benchmark运行参数
-benchtime=3s :指定运行时间 -benchmem:显示分配内存大小,分配内存次数 -cpu=4:指定cpu数量 -count=2:指定运行次数
benchmark性能测试案例
测试目标:
func demo1() { count := 0 mux := sync.Mutex{} wg := sync.WaitGroup{} for i := 0; i < 10000; i++ { wg.Add(1) go func() { defer wg.Done() for j := 0; j < 10000; j++ { mux.Lock() count++ mux.Unlock() } }() } wg.Wait() } func demo2() { wg := sync.WaitGroup{} var count int32 = 0 for i := 0; i < 10000; i++ { wg.Add(1) go func() { defer wg.Done() for j := 0; j < 10000; j++ { atomic.AddInt32(&count, 1) } }() } wg.Wait() }
main_test.go
import ( "testing" ) func BenchmarkDemo1(b *testing.B) { b.ResetTimer() demo1() b.StopTimer() } func BenchmarkDemo2(b *testing.B) { b.ResetTimer() demo2() b.StopTimer() }
启动命令:go test -bench=. -benchmem