一百万个 Go map 条目占 38 MB,不是 16 MB
来源:dev.to — 2026-09-16
📋 概述
作者在 Go 1.27.1 上实测 map[int64]int64:按纸面算法每个条目是 8 字节键加 8 字节值,一百万个条目该占 16 MB,实际堆上约 37.8 MB,也就是每条约 37.8 字节。他沿用测量 goroutine 栈时的办法——大量分配后强制 GC,看运行时报告多少仍然存活——发现每条成本在 21 到 44 字节之间摆动。
🔑 核心要点
- 一个只放一对键值的 map 就要 192 字节堆内存,说明头部开销不会随规模摊薄。
- 大多数文章描述的 bucket 实现在 Go 1.24 就被替换了,旧结构只在 1.23 的 runtime/map.go 里还看得到。
- 每条成本在 21 到 44 字节之间摆动,只取决于条目数量,与键值类型无关。
- 插入和删除在当前实现上的表现,也和流传的写法描述得不一样。
- 实验在 Apple M5 Max 的 Go 1.27.1 上完成,并在 1.26.4 上复测得到相同数字。
💡 金句
唯一决定每条成本的是条目有多少条,而不是键和值有多大。
👍 0
👎 0
← 返回 dev.to 首页