【发布时间】:2017-10-30 15:36:10
【问题描述】:
我很好奇map和slice的内存开销,所以写了一个程序来比较大小。我通过unsafe.Sizeof(s)得到内存大小,但显然是错误的,因为当我改变大小时,输出是一样的。
func getSlice(size int) []int {
t := time.Now()
s := make([]int, size*2)
for i := 0; i < size; i++ {
index := i << 1
s[index] = i
s[index+1] = i
}
fmt.Println("slice time cost: ", time.Since(t))
return s
}
func getMap(size int) map[int]int {
t := time.Now()
m := make(map[int]int, size)
for i := 0; i < size; i++ {
m[i] = i
}
fmt.Println("map time cost: ", time.Since(t))
return m
}
func TestMem(t *testing.T) {
size := 1000
s := getSlice(size)
m := getMap(size)
fmt.Printf("slice size: %d\n", unsafe.Sizeof(s))
fmt.Printf("map size: %d\n", unsafe.Sizeof(m))
}
【问题讨论】:
-
没有需要这样做,因为您可以计算所需的空间:将切片的上限乘以每个元素的大小。对于地图来说,由于某些内部无法访问(例如哈希冲突),因此更加困难,但它基本上是相同的。
标签: dictionary go memory slice