网站首页 > 文章中心 > 其它

尚学堂go语言笔记

作者:小编 更新时间:2023-09-12 07:13:56 浏览量:197人看过

尚学堂高淇哪个学校毕业

Go语言使用 map 时尽量不要在 big map 中保存指针

不知道你有没有听过这么一句:在使用 map 时尽量不要在 big map 中保存指针.好吧,你现在已经听过了:)为什么呢?原因在于 Go 语言的垃圾回收器会扫描标记 map 中的所有元素,GC 开销相当大,直接GG.

这两天在<>中看到 GC 这一章节里面对比 map 和 slice 在垃圾回收中的效率对比,书中只给出结论没有说明理由,这我是不能忍的,于是有了这篇学习笔记.扯那么多,Show Your Code

这是一个简单的测试程序,保存字符串的 map 和 保存整形的 map GC 的效率相差几十倍,是不是有同学会说明明保存的是 string 哪有指针?这个要说到 Go 语言中 string 的底层实现了,源码在 src/runtime/string.go里,可以看到 string 其实包含一个指向数据的指针和一个长度字段.注意这里的是否包含指针,包括底层的实现.

Go 语言的 GC 会递归遍历并标记所有可触达的对象,标记完成之后将所有没有引用的对象进行清理.扫描到指针就会往下接着寻找,一直到结束.

无脑机翻如下:

如果我们有一个map [k] v,其中k和v都不包含指针,并且我们想提高扫描性能,则可以执行以下操作.

将" allOverflow [] unsafe.Pointer"添加到 hmap 并将所有溢出存储桶存储在其中. 然后将 bmap 标记为noScan. 这将使扫描非常快,因为我们不会扫描任何用户数据.

实际上,它将有些复杂,因为我们需要从allOverflow中删除旧的溢出桶. 而且它还会增加 hmap 的大小,所以呢也可能需要重新整理数据.

最终官方在 hmap 中增加了 overflow 相关字段完成了上面的优化,这是具体的 commit 地址.

通过注释可以看出,如果 map 中保存的键值都不包含指针(通过 Haspointers 判断),就使用一个 uintptr 类型代替 bucket 的指针用于溢出桶 overflow 字段,uintptr 类型在 GO 语言中就是个大小可以保存得下指针的整数,不是指针,就相当于实现了 将 bmap 标记为 noScan, GC 的时候就不会遍历完整个 map 了.随着不断的学习,愈发感慨 GO 语言中很多模块设计得太精妙了.

差不多说清楚了,能力有限,有不对的地方欢迎留言讨论,源码位置还是问的群里大佬 _

尚学堂现在有区块链的课程吗?

有的,百战程序员的区块链课程,

百战程序员紧跟时代潮流,推出满足企业需求的在线课程,实时更新,全面系统,让学员们第一时间获取最新知识,

打造自己的核心竞争力,不被时代落下.

链接:

提取码:qyzq ?

书名:Go语言学习笔记

出版社:?电子工业出版社

内容简介

作为时下流行的一种系统编程语言,Go 简单易学,性能很好,且支持各类主流平台.已有大量项目采用 Go 编写,这其中就包括 Docker 等明星作品,其开发和执行效率早已被证明.本书经四年多逐步完善,内容覆盖了语言、运行时、性能优化、工具链等各层面知识.且内容经大量读者反馈和校对,没有明显的缺陷和错误.上卷细致解析了语言规范相关细节,便于读者深入理解语言相关功能的使用方法和注意事项.下卷则对运行时源码做出深度剖析,引导读者透彻了解语言功能背后的支持环境和运行体系,诸如内存分配、垃圾回收和并发调度等.本书不适合编程初学入门,可供有实际编程经验或正在使用Go 工作的人群参考.

以上就是土嘎嘎小编为大家整理的尚学堂go语言笔记相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章