前言
在利用printf输出时同时用到了%d和%v两个占位符,就突然想知道他们两个的性能差异,于是利用了testing包中的benchmark来对其性能进行了测试。
源代码如下
func BenchmarkFmtD(b *testing.B) {
for i := 0; i < b.N; i++ {
fmt.Sprintf("%d", 123456789)
}
}
func BenchmarkFmtV(b *testing.B) {
for i := 0; i < b.N; i++ {
fmt.Sprintf("%v", 123456789)
}
}
以下是控制台输出结果
PS C:\Users\15037\GolandProjects\new\testing> go test -bench=BenchmarkFmt -benchtime=10s -benchmem
goos: windows
goarch: amd64
pkg: new/testing
cpu: AMD Ryzen 7 6800H with Radeon Graphics
BenchmarkFmtD-16 204133696 58.40 ns/op 16 B/op 1 allocs/op
BenchmarkFmtV-16 205663795 58.88 ns/op 16 B/op 1 allocs/op
PASS
ok new/testing 36.061s
另一次测试
BenchmarkFmtD-16 394344610 60.25 ns/op 16 B/op 1 allocs/op
BenchmarkFmtV-16 399079084 59.85 ns/op 16 B/op 1 allocs/op
分析
在每个函数运行了两亿次和四亿次之后,其平均每次运行的时间分别为58.40纳ns和58.8ns以及60.25ns和59.85ns,其差距很小
结论
%d和%v的性能差距极小,可以忽略,并且在不同的测试条件下优劣也略有差异。