学习了go的map和slice的内存结构,可以从理论上得知存储同等数量相同元素,map占用的内存比slice大,那么怎么去验证这一点呢,下面我用pprof实际验证一下。
假设元素类型定义如下:
type canceler struct { | |
code int | |
data uintptr | |
} |
先测试slice的内存占用,代码如下:
func sliceMemoryUse(num int) { | |
max := make([]canceler, num, num) | |
_ = &max | |
} | |
func main() { | |
num := 1024 * 1024 | |
sliceMemoryUse(num) | |
f, _ := os.Create("mem.out") | |
pprof.WriteHeapProfile(f) | |
f.Close() | |
} | |
/* | |
这里用到了runtime.pprof包来收集内存信息,如果要收集cpu的信息,则使用如下代码: | |
f, err := os.Create("cpu.out") | |
pprof.StartCPUProfile(f) | |
// do some stuff | |
pprof.StopCPUProfile() | |
*/ |
使用pprof检查一下
go tool pprof --alloc_space mem.out | |
flat flat% sum% cum cum% | |
16MB 100% 100% 16MB 100% main.sliceMemoryUse (inline) | |
0 0% 100% 16MB 100% main.main | |
0 0% 100% 16MB 100% runtime.main |
再测试map的内存占用,代码如下:
func mapMemoryUse(num int) { | |
max := make(map[canceler]struct{}, num) | |
_ = &max | |
} | |
func main() { | |
num := 1024 * 1024 | |
mapMemoryUse(num) | |
f, _ := os.Create("mem.out") | |
pprof.WriteHeapProfile(f) | |
f.Close() | |
} |
使用pprof检查一下
go tool pprof --alloc_space mem.out | |
flat flat% sum% cum cum% | |
38.25MB 100% 100% 38.25MB 100% main.mapMemoryUse (inline) | |
0 0% 100% 38.25MB 100% main.main | |
0 0% 100% 38.25MB 100% runtime.main |