面试题答案
一键面试在Go语言中,为了性能最优,创建包含100万个整数的切片应使用make
函数并指定容量,如下:
nums := make([]int, 0, 1000000)
性能优势底层原理分析
- 内存分配机制:Go语言的内存分配器采用了一种高效的分层结构。当使用
make
函数并指定容量时,Go内存分配器会预先分配一块连续的内存空间来存储这100万个整数。这避免了在切片增长过程中频繁的内存分配与释放操作。如果不指定容量,随着切片元素的添加,会不断触发动态内存分配,这些分配操作会增加内存碎片,降低内存分配的效率。 - 切片数据结构:Go语言的切片是一种轻量级的数据结构,它由一个指向底层数组的指针、切片的长度和容量组成。通过
make([]int, 0, 1000000)
创建的切片,其底层数组一开始就拥有能容纳100万个整数的空间,长度为0。这种结构使得对切片的操作非常高效,因为不需要频繁调整底层数组的大小。 - 扩容策略:Go语言切片的扩容策略是,当切片的容量不足以容纳新的元素时,会重新分配内存,创建一个新的底层数组,并将原数组的内容复制到新数组中。如果一开始不指定容量,在添加100万个元素的过程中,会多次触发扩容操作。每次扩容通常会使容量翻倍(在Go 1.18之前),这意味着会有大量的数据复制操作。而通过
make
函数指定容量为100万,从一开始就避免了这种频繁的扩容和数据复制,大大提高了性能。