go性能编程 slice 初始化对比

平时我们使用的切片使用是否有有注意初始化,他们各种初始化的方式性能对比有多大了

方案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的函数的重复调用。

所以在平时开发时,如果知道切片的长度,那么没必要分配一个空切片,我们应该分配有特定长度或者容量的切片,在上面方案三中速度最快,但是方案二更容易读和实现。


在线交流