平时我们使用的切片使用是否有有注意初始化,他们各种初始化的方式性能对比有多大了
方案1
func sliceCreateSlow() []int {
a := make([]int, 0)
for i := 0; i < 10000; i++ {
a = append(a, i)
}
return a
}
方案2
func sliceCreateMiddle() []int {
a := make([]int, 0, 10000)
for i := 0; i < 10000; i++ {
a[i] = i
}
return a
}
方案3
func sliceCreateFast() []int {
a := make([]int, 10000)
for i := 0; i < 10000; i++ {
a[i] = i
}
return a
}
BenchmarkSliceCreateSlow_Error-8 19034 55769 ns/op
BenchmarkSliceCreateMiddle_Error-8 80485 15369 ns/op
BenchmarkSliceCreateFast_Error-8 103717 11466 ns/op
可以看到方案一在性能方面和其他对比差距是特别大的,由于我们不停的分配数组和复制元素,导致第二个方案的耗时比第一个方案快了3.6倍的时间,第三种方案比第二种方案耗时快了1.3倍,因为它避免了append的函数的重复调用。
所以在平时开发时,如果知道切片的长度,那么没必要分配一个空切片,我们应该分配有特定长度或者容量的切片,在上面方案三中速度最快,但是方案二更容易读和实现。