Go程序提速42%,只需改变一个字符(go程序运行)

梦晨 发自 凹非寺
量子位 | 公众号 QbitAI

Go语言本来就以轻量快速著称,一位GitHub员工却偶然发现:

只改变一个字符的位置,能把一段代码运行速度提高足足42%

Go程序提速42%,只需改变一个字符(go程序运行)

简直就像是……

Go程序提速42%,只需改变一个字符(go程序运行)

这个简单有效的技巧一经发布,就引来众多程序员围观。

原作者自己也调侃,一般这种情况都是事先犯了个愚蠢的错误,后面才能提升这么大。

不过顺着这个思路发现有人发现,就连Go开发团队的核心人物Russ Cox都在标准库中犯过同样的错误

Go程序提速42%,只需改变一个字符(go程序运行)

什么样的错误?

发现这个问题的Harry在大型程序员交友平台GitHub工作。

他在开发一个把GitHub仓库中每个文件的所有者列出来的小工具。

功能很简单,就是根据CODEOWNERS文件中定义的规则匹配,写在越下面的规则优先级越高。

Go程序提速42%,只需改变一个字符(go程序运行)

原理也很简单,就是从后往前一条一条处理,匹配到了就停止。

Go程序提速42%,只需改变一个字符(go程序运行)

但就是这样一个简单的程序却出现了性能问题,处理中等大小的仓库就很慢了。

Go程序提速42%,只需改变一个字符(go程序运行)

他打印出火焰图,发现大部分时间都花在了Go语言的正则表达式引擎中。

另外在内存动态分配malloc垃圾回收gc上面的花费也值得注意。

Go程序提速42%,只需改变一个字符(go程序运行)

要减少malloc的时间,就需要用到Go语言的逃逸分析(Escape Analysis)了。

简单来说,就是尽量把变量分配到栈上,让编译器自动管理内存的释放。

只有在“逃逸”也就是变量的作用域超出所在的栈时,才把变量分配到堆上,减轻运行时GC的压力。

在这次的程序中,Harry确定了逃逸的变量是rule这个结构体(struct)。

Go程序提速42%,只需改变一个字符(go程序运行)

但问题是,rule存储在RuleSet这个切片(slice)里,按Go语言的规则可以确信他已经在堆中了。

再分析一下代码,发现在给rule赋值的时候实际上是做了一次不必要的拷贝,后面用“&”取地址时候创建了一个逃逸的指针指向它的副本。

Go程序提速42%,只需改变一个字符(go程序运行)

最后解决办法也很容易想出,只需要把&移动到上面。

Go程序提速42%,只需改变一个字符(go程序运行)

这样就引用了切片中的结构体,避免了拷贝。

如何彻底避免?

在热议中,有网友分享了自己是怎么避免出现这个问题的。

对于每个结构体,把它看作纯值或纯指针,压根就不去使用&这种取地址的操作,避免隐式的内存分配。

Go程序提速42%,只需改变一个字符(go程序运行)

如果你想要深入理解这个问题,也有人贴心的给出了需要提前了解的一些背景知识。

Go程序提速42%,只需改变一个字符(go程序运行)

最后有人指出,Rust语言为避免这个问题,直接规定必须显式操作才能拷贝一个数据结构。

Go程序提速42%,只需改变一个字符(go程序运行)

当你不习惯的时候这规定烦得要命,但是总的来看还是值得。

方便or规范,你更倾向于哪种做法?

参考链接:
[1]https://hmarr.com/blog/go-allocation-hunting/

[2]https://news.ycombinator.com/item?id=33594676

— 完 —

量子位 QbitAI · 头条号签约

关注我们,第一时间获知前沿科技动态

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年3月17日 上午10:06
下一篇 2023年3月17日 上午10:22

相关推荐

  • 大创负责人曾参与科研项目大创负责人曾参与科研项目

    大创负责人曾参与科研项目 作为一所高等教育机构的校长,我深知大创活动的重要性。大创活动是学校鼓励师生积极参与创新创业活动,提升师生创新创业能力的一项重要举措。在过去的几年中,我们已…

    科研百科 2024年9月3日
    34
  • 建设项目档案管理系统

    建设项目档案管理系统 随着现代建筑行业的不断发展,建设项目的档案管理也变得越来越重要。一个有效的档案管理系统可以帮助项目管理人员更好地管理项目文件,确保项目进度和质量的跟踪,同时也…

    科研百科 2024年8月18日
    62
  • 研发项目经费管理制度模板

    研发项目经费管理制度模板 随着科技的不断发展,企业的研发工作也越来越重要。为了支持企业的研发工作,企业需要建立一套合理的研发项目经费管理制度,以保证经费的使用高效、合理、透明。本文…

    科研百科 2024年5月25日
    146
  • 讯飞智能录音笔体验:这大概就是高端录音笔的标准(讯飞智能录音笔认准很好用)

    讯飞智能录音笔,SR501标准版1999元,SR701旗舰版2999元。当人们了解到它的定价,免不了有些意外。明明有的互联网公司出品的智能录音笔才小几百元,讯飞智能录音笔1999元…

    科研百科 2022年11月20日
    186
  • 平凉市崆峒区教育重点项目建设稳步推进(平凉市崆峒区教育重点项目建设稳步推进)

    转发;平凉微电视 2022-09-09 16:28 发表于甘肃 教育重点建设项目是优化全区教育资源布局的关键环节和具体举措。今年以来,我区科学安排、精准施策,持续加快推进学校项目建…

    科研百科 2024年4月17日
    87
  • 党员活动室建设实施方案

    党员活动室建设实施方案 为贯彻落实党的路线方针政策,加强党员队伍建设,提高党员活动水平,现制定党员活动室建设实施方案。 一、建设目标 建设党员活动室,包括室内和室外设施,达到宽敞明…

    科研百科 2024年11月7日
    26
  • 甘特图项目管理软件

    甘特图项目管理软件是一种功能强大的软件工具,可以帮助项目经理和团队成员高效地规划和管理项目。本文将介绍甘特图项目管理软件的一些特点和优势,以及如何有效地使用它来改善项目管理。 甘特…

    科研百科 2024年7月22日
    42
  • 简单的项目管理软件

    简单的项目管理软件 项目管理软件是一种工具,可以帮助项目经理和团队成员跟踪和管理项目进度,协调资源,确保项目成功完成。虽然有许多不同的项目管理软件可供选择,但以下是一个简单的项目管…

    科研百科 2024年7月28日
    42
  • 基于bim的工程进度管理

    基于BIM的工程进度管理 随着建筑行业数字化的快速发展,BIM技术已成为工程进度管理中不可或缺的一部分。BIM技术是一种基于数字化建模和共享的信息技术,它可以用于建筑项目的决策、规…

    科研百科 2024年9月23日
    23
  • 有科研项目的美国文理学院

    美国文理学院在科研项目方面一直处于领先地位,不仅拥有众多高水平的学术研究机构和教授,同时也拥有众多优秀的科研项目。这些科研项目不仅对于美国的学术发展有着重要的影响,同时也对于全球的…

    科研百科 2024年8月10日
    41