18 预分配字典空间
func test1() map[int]int {
m := make(map[int]int)
for i := 0; i < 10000; i++ {
m[i] = i
}
return m
}
func test2() map[int]int {
m := make(map[int]int, 10000)
for i := 0; i < 10000; i++ {
m[i] = i
}
return m
}
func BenchmarkTest(b *testing.B) {
b.Run("normal", func(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = test1()
}
})
b.Run("prealloc", func(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = test2()
}
})
}
第一个我们不对字典提前设置容量,我们往里面去追加数据时候让它动态去扩容。第二个我们提前设置足够大的空间,来减少中间的扩容和内存分配操作。
$ go test -bench . -benchmem
BenchmarkTest/normal-4 2000 937146 ns/op 687428 B/op 278 allocs/op
BenchmarkTest/prealloc-4 3000 523648 ns/op 322307 B/op 12 allocs/op
我们可以看到它们的性能差别并不大,最大的问题是每次操作分配