golang maps 预留多少内存?

Posted

技术标签:

【中文标题】golang maps 预留多少内存?【英文标题】:How much memory do golang maps reserve? 【发布时间】:2018-02-26 21:57:03 【问题描述】:

给定一个未指定初始space 的地图分配,例如:

foo := make(map[string]int)

documentation 表明这里的内存分配取决于实现。那么(如何)我可以知道我的实现分配了多少内存给这个映射?

【问题讨论】:

【参考方案1】:

您可以使用 Go 测试工具来测量任意复杂数据结构的大小。此答案中对此进行了详细说明:How to get variable memory size of variable in golang?

make(map[string]int)
var x map[string]int

func BenchmarkEmptyMap(b *testing.B) 
    for i := 0; i < b.N; i++ 
        x = make(map[string]int)
    

执行

go test -bench . -benchmem

结果是:

BenchmarkEmptyMap-4     20000000   110 ns/op      48 B/op    1 allocs/op

所以答案在我的 64 位架构上:48 字节

make()
func BenchmarkEmptyMapCap100(b *testing.B) 
    for i := 0; i < b.N; i++ 
        x = make(map[string]int, 100)
    

输出:

BenchmarkEmptyMapCap100-4   1000000    1783 ns/op   4176 B/op    3 allocs/op
map[string]int

如果未明确指定,默认初始容量约为 7。

【讨论】:

如果我分配一个大小为 1000 的映射,即使映射中的值少于 1000 个,映射的内存使用量会增加吗?我想确定地图的内存使用情况,或者至少确定一个上限。它是评估缓存的内存使用成本。 @chmike 这个答案为您提供了测试它的工具。你有没有尝试过?顺便说一句,是的,由于 hashmap 内部(存储桶的使用和分配),内存使用和分配可能会增加一点。但与整个地图的内存占用相比,这“微不足道”。【参考方案2】:
hmapbmaphint

一个标头由几个字段组成:

intuint8uint16uint32unsafe.Pointeruintptr
intuintptrunsafe.Pointer
uint8

这总共有 40 + 8 = 48 个字节(64 位架构)

【讨论】:

以上是关于golang maps 预留多少内存?的主要内容,如果未能解决你的问题,请参考以下文章