Benchmark
新建测试文件
util.go文件
1
2
3
4
5
6
7
8
9
10
11
|
func GetMd5V(s string) string {
h := md5.New()
h.Write([]byte(s))
return hex.EncodeToString(h.Sum(nil))
}
func SumMd5(s string) string {
data := []byte(s)
return fmt.Sprintf("%x", md5.Sum(data))
}
|
以_test结尾的文件, 如util_test.go
1
2
3
4
5
6
7
8
9
10
|
func BenchmarkSumMd5(b *testing.B) {
for i := 0; i < b.N; i++ {
SumMd5("1")
}
}
func BenchmarkGetMd5V(b *testing.B) {
for i := 0; i < b.N; i++ {
GetMd5V("1")
}
}
|
运行Benchmark函数
1
|
go test -bench="." -benchmem
|
输出结果
1
2
3
4
5
|
BenchmarkSumMd5-8 1719777 847 ns/op 64 B/op 3 allocs/op
BenchmarkGetMd5V-8 1861362 644 ns/op 184 B/op 5 allocs/op
PASS
ok openapi/app/util 4.493s
|
- 第二列, 1719777, 1861362 代表执行的次数, 越高越好.
- ns/op 代表多少纳秒执行一次操作, 越低越好
- B/op 每次操作内存占用字节数, 越低越好
- allocs/op 每次操作内存分配次数, 越低越好
性能分析
1
2
|
go test -bench="." -cpuprofile=prof.out
go tool pprof prof.out
|
-blockprofilerate n
:goroutine 阻塞时候打点的纳秒数。默认不设置就相当于 -test.blockprofilerate=1,每一纳秒都打点记录一下。
-coverprofile cover.out
:在所有测试通过后,将覆盖概要文件写到文件中。设置过 -cover。
-cpuprofile cpu.out
:在退出之前,将一个 CPU 概要文件写入指定的文件。
-memprofile mem.out
:在所有测试通过后,将内存概要文件写到文件中。
-memprofilerate n
:开启更精确的内存配置。如果为 1,将会记录所有内存分配到 profile。
使用Graphviz分析性能


- 标红的矩形是cpu耗时最长的.
- 线最粗的同理.
- 显示时有耗时与占比.一目了然.分析利器
参考
- Go 测试,go test 工具的具体指令 flag
- Go 基准测试
- 安装Graphviz