不知道你有没有听过这么一句:在使用 map 时尽量不要在 big map 中保存指针。好吧,你现在已经听过了:)为什么呢?原因在于 Go 语言的垃圾回收器会扫描标记 map 中的所有元素,GC 开销相当大,直接GG。
华容网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站建设等网站项目制作,到程序开发,运营维护。创新互联于2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
这两天在《Mastering Go》中看到 GC 这一章节里面对比 map 和 slice 在垃圾回收中的效率对比,书中只给出结论没有说明理由,这我是不能忍的,于是有了这篇学习笔记。扯那么多,Show Your Code
这是一个简单的测试程序,保存字符串的 map 和 保存整形的 map GC 的效率相差几十倍,是不是有同学会说明明保存的是 string 哪有指针?这个要说到 Go 语言中 string 的底层实现了,源码在 src/runtime/string.go里,可以看到 string 其实包含一个指向数据的指针和一个长度字段。注意这里的是否包含指针,包括底层的实现。
Go 语言的 GC 会递归遍历并标记所有可触达的对象,标记完成之后将所有没有引用的对象进行清理。扫描到指针就会往下接着寻找,一直到结束。
Go 语言中 map 是基于 数组和链表 的数据结构实现的,通过 优化的拉链法 解决哈希冲突,每个 bucket 可以保存 8 对键值,在 8 个键值对数据后面有一个 overflow 指针,因为桶中最多只能装 8 个键值对,如果有多余的键值对落到了当前桶,那么就需要再构建一个桶(称为溢出桶),通过 overflow 指针链接起来。
因为 overflow 指针的缘故,所以无论 map 保存的是什么,GC 的时候就会把所有的 bmap 扫描一遍,带来巨大的 GC 开销。官方 issues 就有关于这个问题的讨论, runtime: Large maps cause significant GC pauses #9477
无脑机翻如下:
如果我们有一个map [k] v,其中k和v都不包含指针,并且我们想提高扫描性能,则可以执行以下操作。
将“ allOverflow [] unsafe.Pointer”添加到 hmap 并将所有溢出存储桶存储在其中。 然后将 bmap 标记为noScan。 这将使扫描非常快,因为我们不会扫描任何用户数据。
实际上,它将有些复杂,因为我们需要从allOverflow中删除旧的溢出桶。 而且它还会增加 hmap 的大小,因此也可能需要重新整理数据。
最终官方在 hmap 中增加了 overflow 相关字段完成了上面的优化,这是具体的 commit 地址。
下面看下具体是如何实现的,源码基于 go1.15,src/cmd/compile/internal/gc/reflect.go 中
通过注释可以看出,如果 map 中保存的键值都不包含指针(通过 Haspointers 判断),就使用一个 uintptr 类型代替 bucket 的指针用于溢出桶 overflow 字段,uintptr 类型在 GO 语言中就是个大小可以保存得下指针的整数,不是指针,就相当于实现了 将 bmap 标记为 noScan, GC 的时候就不会遍历完整个 map 了。随着不断的学习,愈发感慨 GO 语言中很多模块设计得太精妙了。
差不多说清楚了,能力有限,有不对的地方欢迎留言讨论,源码位置还是问的群里大佬 _
《Go语言学习笔记》(雨痕)电子书网盘下载免费在线阅读
链接:
提取码:rta5
书名:Go语言学习笔记
作者:雨痕
豆瓣评分:8.1
出版社:电子工业出版社
出版年份:2016-6
页数:468
内容简介:
作为时下流行的一种系统编程语言,Go 简单易学,性能很好,且支持各类主流平台。已有大量项目采用 Go 编写,这其中就包括 Docker 等明星作品,其开发和执行效率早已被证明。本书经四年多逐步完善,内容覆盖了语言、运行时、性能优化、工具链等各层面知识。且内容经大量读者反馈和校对,没有明显的缺陷和错误。上卷细致解析了语言规范相关细节,便于读者深入理解语言相关功能的使用方法和注意事项。下卷则对运行时源码做出深度剖析,引导读者透彻了解语言功能背后的支持环境和运行体系,诸如内存分配、垃圾回收和并发调度等。本书不适合编程初学入门,可供有实际编程经验或正在使用Go 工作的人群参考。
作者简介:
自 1996 年从事计算机软件开发工作以来,已 20 春秋。期间供职于北大方正、西单电子商务、九城数码、知乎等公司。主要从事核心开发、架构设计,以及部分管理工作。
先搞清你要搞web前端还是后台.后台的话,就把php\perl\python\ruby之一学好(能会两个更好),当然了,html\css\js都得会的说.c和c++一定要会,这是作为一个程序员的基础.数据库自然是要学的.socket编程是要会的,最好能再简单的读一读tcp/ip协议.前台我就不清楚了.像你说的c#若是有兴趣学学是很好的,go就算了吧,一是资料太少,二是目前go没有公司进行大规模应用,前途不是很明朗(不是没前途,是不明朗.)还有就是,搞硬件相关的底层开发,是工资最高的了(一般情况下,特例排除~~)socket编程要是学的好,工作自然也是不愁的~~
个人觉得C语言最重要 能把这个学好学透对以后学习其它编程语言都有一定帮助,以后要是从是单片机的话用的也是C语言,要是从事ARM开发也是一样,还有写驱动,写应用程序等都是用到C语言
学习目标
1.熟读课文,了解故事发生的情境,能从内心批评和唾弃托德和老板在金钱面前的丑恶嘴脸。
2.通过对描写人物的语言的揣摩,把握托德和老板的特点,感受课文神态描写和语言描写的传神之处。
3.认识课文中的4个生字,积累有关语言。
课前准备
课前介绍《百万英镑》的故事梗概。
课时安排
1课时
A案
教学过程
一、新课导入
1.谈话:感受了中国文学作品中的一些人物形象,让我们再来看看外国作家笔下的人。下面这篇课文选自美国著名作家马克土温写的短篇小说《百万英镑》。
2.了解故事梗概
一个富豪之家的两兄弟,从银行中取出面额为一百万英镑的钞票,藉此验证这一百万的价值。他们选择了身无分文的年轻人作为实验品。于是一个流落伦敦街头的穷光蛋忽然之间得到了一张一百万英镑的钞票,他的生活由此发生了翻天覆地的改变,引起了他生活方式的突变……
3.揭题:24*金钱的魔力
二、自读课文,畅谈体会
1.静心读文,想想可以用哪些词语概括老板和托德的特点,课文的哪些描写突出了这些特点。(在书上作批注。)
2.交流阅读感受。
(1)学生在四人学习小组交流,谈谈对两个人物的评价。推选代表准备全班交流。
(2)派代表分别在写有“老板”和“托德”的题板上写上概括性的词语。
例:
老板:见钱眼开、金钱的奴隶……
托德:以貌取人、刻薄、世故……
3.各学习小组针对其中一个人物选取课文中一处最精彩的描写读一读,谈谈体会。教师结合学生的交流,相机指导:
◆关于“托德”:
(1)入木三分的语言描写:
那个家伙摆出一副非常刻薄的嘴脸,说道:“啊,是吗?哼,当然我也料到了你没有带零钱。我看像你这样的阔人是只会带大票子的。”——(抓住:“刻薄的嘴脸”读出“刻薄的语气”。)
他一听这些话,态度稍微改了一点儿,但是他仍旧有点儿摆着架子回答我:“我并没有恶意……恰恰相反,我们换得开!”——(抓住“仍旧”“摆着架子”读出“善变”。)
(2)细致入微的神情刻画:
他微笑着接了过去,那种笑容是遍布满脸的,……恰像你所看到的维苏威火山边上那些小块平地上凝固起来的波状的、満是蛆虫似的一片一片的熔岩一般。
你体会到什么?是怎么读懂的?
(点拨:托德神情的变化:“笑容是遍布满脸的”——“凝结”、“毫无光彩”;通过表情朗读体会比喻的妙用。)
◆关于“老板”:
(1)动作描写:
老板望了一眼,吹了一声轻快的口哨,一下子钻进那一堆顾客拒绝接受的衣服里,把它来回翻动,同时一直很地说着话,好像在自言自语似的:
(引导抓住:“钻进”“来回翻动”“兴奋地说着话”,想象人物的连续动作,体会人物的心情。)
(2)生动传神的语言描写:(课文12~18自然段。)
学生自由试读十二自然段,谈谈感受。分角色朗读。(较快的语速,体现人物的金钱的奴隶媚态。)
4.小结、提炼:读了文章,托德与老板的可耻嘴脸及性格跃然纸上,呼之欲出,这都缘于作者对人物的生动传神的动作描写,细致入微的神情刻画,入木三分的语言描写。
三、拓展延伸,引发阅读兴趣
一个富豪之家的两兄弟,从银行中取出面额为一百万英镑的钞票,藉此验证这一百万的价值。他们选择了身无分文的年轻人作为实验品。于是一个流落伦敦街头的穷光蛋忽然之间得到了一张一百万英镑的钞票,他的生活由此发生了翻天覆地的改变,引起了他生活方式的突变……想知道故事的原文吗?(这段最好放在前面,介绍背景,帮助孩子更好地理解课文)
1.在《百万英镑》这篇短篇小说中处处可寻觅到这样的生动描写。感兴趣的同学可读原文,进一步感受作家笔下的人物特点。
(发下原文的阅读材料或者介绍网站。)
2.了解作者——马克·吐温
马克·吐温是美国批判现实主义文学的奠基人,世界著名的短篇小说大师。他经历了美国从“自由”资本主义到帝国主义的发展过程,其思想和创作也表现为从轻快调笑到辛辣讽刺再到悲观厌世的发展阶段。马克吐温的《镀金时代》、《汤姆索亚历险记》《王子与乞丐》等作品,描绘了一幅幅形象资本主义社会的幽默画。这些作品读来亲切、自然,充满轻松的幽默又蕴涵深刻的批判意义,受到广大读者的欢迎和喜爱。
四、作业
阅读一篇文章,做一则读书笔记:(课标《同步阅读》同主题文章)摘录语言描写、动作描写、神情描写的句子,概括人物的性格特点。
(福建省厦门市康乐小学 叶雪冰)
B案
教学过程
一、初读课文,了解故事
1.出示课题“金钱的魔力”。
2.自由读课文,思考:从课文的描写中看,金钱到底有怎样的魔力?
3.课堂交流。
学生可能有各种回答,都是他们对课文的理解,应该尽量承认他们的有限合理性,但是一定要围绕课文,从课文中得出结论。比如:金钱可以让一个人的笑容凝固;金钱可以一下子改变一个人的态度;金钱可以让一个流浪汉受人尊重……
同时,还要让学会生朗读相应的课文,以检测学生认识生字,读通课文的情况。
二、再读课文,谈谈感受
1.默读课文,思考:
(1)读了课文,你对托德和老板有什么感受?用一个词来表达你的感受。比如:讨厌、喜欢、厌恶等。
(2)你的这种感受来自于什么地方?在课文中找出有关的句段,说说理由或有感情地朗读。
2.小组讨论,形成组内意见,推选发言人。
3.课堂交流,谈谈感受。
一般情况下,学生一致的感受是讨厌或厌恶,但也不能排除有些学生有不同的感受,但要让学生把话说完,注意学生分析的理由是否言之有理,同时也要注意正确的价值观的引导。
理由主要集中在两个地方:
(1)托德:从刻薄的嘴脸到一脸的窘况,主要集中在托德笑容的变化。
(2)老板:从耻高气昂到过分殷勤,主要集中在他说的一场段话中。
4.讨论,我们为什么要厌恶或讨厌他们呢?托德和老板有什么特点,可以用哪些词语来概括。
三、研读重点,体会语言
1.读读课文中有关段落,想一想:在这篇课文中,你觉得托德和老板这两个人,哪一个描写得更加传神?
《Go语言学习笔记》(雨痕)电子书网盘下载免费在线阅读
链接:
提取码:qyzq
书名:Go语言学习笔记
豆瓣评分:8.1
作者: 雨痕
出版社: 电子工业出版社
出品方: 博文视点
出版年: 2016-6
页数: 468
内容简介
作为时下流行的一种系统编程语言,Go 简单易学,性能很好,且支持各类主流平台。已有大量项目采用 Go 编写,这其中就包括 Docker 等明星作品,其开发和执行效率早已被证明。本书经四年多逐步完善,内容覆盖了语言、运行时、性能优化、工具链等各层面知识。且内容经大量读者反馈和校对,没有明显的缺陷和错误。上卷细致解析了语言规范相关细节,便于读者深入理解语言相关功能的使用方法和注意事项。下卷则对运行时源码做出深度剖析,引导读者透彻了解语言功能背后的支持环境和运行体系,诸如内存分配、垃圾回收和并发调度等。本书不适合编程初学入门,可供有实际编程经验或正在使用Go 工作的人群参考。
作者简介
自 1996 年从事计算机软件开发工作以来,已 20 春秋。期间供职于北大方正、西单电子商务、九城数码、知乎等公司。主要从事核心开发、架构设计,以及部分管理工作。