当前位置: 首页 > news >正文

Go map 大小

如何得到一个 map 占用了多少内存

go get github.com/520MianXiangDuiXiang520/MapSize
package mainimport ("fmt""github.com/520MianXiangDuiXiang520/MapSize"
)func main() {m := make(map[int]struct{})for i := 0; i < 100; i++ {m[i] = struct{}{}}fmt.Println(mapsize.Size(m)) // 1416
}

思路:

map 底层是 runtime.hmap 只需要使用 unsafe 将 map 指针对应的内存强转就可以得到 map 申请的桶的个数了,乘以键值的大小就可以算出内存占用情况:

func Size[K comparable, V any](m map[K]V) int64 {var zeroK Kvar zeroValue VkeySize := unsafe.Sizeof(zeroK)valueSize := unsafe.Sizeof(zeroValue)vo := reflect.ValueOf(m)hm := (*hmap)(unsafe.Pointer(vo.Pointer()))bn := 1<<hm.B + uintptr(hm.noverflow)bz := unsafe.Sizeof(bmap{}) + (keySize+valueSize)*bucketCntreturn int64(unsafe.Sizeof(hmap{}) + bz*bn)
}

注意:由于 noverflow 并不是真实的溢出桶数量,所以这种方法得到内存占用并不完全准确,但 map 本身的阔缩容用的也是 noverflow 所以与实际情况并不会差很多,通过 pprof 测试也几乎一致

相关文章:

  • ubuntu20.04在noetic下编译orbslam2
  • AI:99-基于深度学习的飞机故障检测与维修
  • 美团赚钱更难了,Q3核心业务利润率下降2%,市值一年缩水近6000亿
  • 【细说Java内部类】
  • java stream的常见操作
  • 智能优化算法应用:基于头脑风暴算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • 深度学习中的各类评价指标
  • Datawhale聪明办法学Python(task3变量与函数)
  • Docker笔记:容器转换成镜像,导出导入镜像,数据拷贝,查看日志
  • digit函数
  • 一文搞懂OSI参考模型与TCP/IP
  • js-过滤制表符
  • iOS按钮控件UIButton使用
  • Docker 安装Apache Superset 并实现汉化和快速入门
  • 构建自己专属seata-server 镜像(分布式事务)?(第二篇)
  • [PHP内核探索]PHP中的哈希表
  • .pyc 想到的一些问题
  • 【翻译】babel对TC39装饰器草案的实现
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 30秒的PHP代码片段(1)数组 - Array
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • angular2开源库收集
  • Babel配置的不完全指南
  • Bytom交易说明(账户管理模式)
  • conda常用的命令
  • css选择器
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Linux后台研发超实用命令总结
  • Logstash 参考指南(目录)
  • MaxCompute访问TableStore(OTS) 数据
  • nodejs调试方法
  • redis学习笔记(三):列表、集合、有序集合
  • ucore操作系统实验笔记 - 重新理解中断
  • uva 10370 Above Average
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • vue--为什么data属性必须是一个函数
  • 包装类对象
  • 编写符合Python风格的对象
  • 彻底搞懂浏览器Event-loop
  • 从重复到重用
  • 对象引论
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 欢迎参加第二届中国游戏开发者大会
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 警报:线上事故之CountDownLatch的威力
  • 无服务器化是企业 IT 架构的未来吗?
  • ​queue --- 一个同步的队列类​
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #1015 : KMP算法
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • $jQuery 重写Alert样式方法
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (07)Hive——窗口函数详解