Go 性能优化之slice

73 阅读2分钟

性能优化

slice 以及 map 预分配内存

在使用make帮slice初始化切片时,尽可能提供容量信息.

下面的例子是利用基准测试进行性能测试。

(测试部分的目录文件如下)

image.png

必须以 _test.go 命名且基准测试的函数必须以Benchmark开头 。基准测试函数不允许有返回值,被测试的代码要放到循环里。(动动小手在终端敲 : go test -bench = . 即运行所有的基准测试)

image.png

BenchmarkSliceA-8 中的-8表示运行时对应的GOMAXPROCS的值;4987270表示被测试代码的次数;248.9表示每次需要花费的时间为248.9纳秒。显然Bslice比Bslice要快,即在make帮slice初始化时,提供容量信息的性能更优。

同样道理,Bmap也是要比Amap快,也应该在map初始化时提供初始化的长度。

如果在执行 go test -bench=. 出现以下情况:

image.png

别担心,这是因为你在windows系统下执行了此命令。此时需要将=去掉。 即如果是在windows系统下执行,那么执行的是 go test -bench . ; 如果是在linux下执行,那么执行的是 go test -bench=. 。

slice 与 map 分析

1.slice . 切片的本质是一个结构体,也是一个数组片段的描述,其包括数组指针,长度,容量。

image.png

. 切片操作不会复制切片指向的元素

. 创建一个新的切片会复用原来切片的底层数组 . 在已有切片基础上创建切片,不会创建新的底层数组。

2.map

. 不断向map中添加元素的操作会触发map的扩容

. 提前分配好空间可以减少内存拷贝和Rehash 的消耗

. 建议根据需求提前预估好需要的空间