Go法式提速42%,只需改动一个字符

2周前 (02-09 21:44)阅读1回复0
kewenda
kewenda
  • 管理员
  • 注册排名1
  • 经验值158390
  • 级别管理员
  • 主题31678
  • 回复0
楼主

梦晨 发自 凹非寺

量子位 | 公家号 QbitAI

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

只改动一个字符的位置,能把一段代码运行速度进步足足 42%。

几乎就像是……

Go法式提速42%,只需改动一个字符

那个简单有效的身手一经发布,就引来浩瀚法式员围看。

原做者本身也调侃,一般那种情状都是事先犯了个愚笨的错误,后面才气提拔那么大。

不外顺着那个构想发现有人发现,就连 Go开发团队的核心人物Russ Cox都在原则库中犯过同样的错误。

Go法式提速42%,只需改动一个字符

什么样的错误?

展开全文

发现那个问题的Harry在大型法式员交友平台GitHub工做。

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

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

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

Go法式提速42%,只需改动一个字符

但就是如许一个简单的法式却呈现了性能问题,处置中等大小的仓库就很慢了。

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

别的在 内存动态分配malloc和 垃圾收受接管 gc上面的破费也值得重视。

Go法式提速42%,只需改动一个字符

要削减malloc的时间,就需要用到Go语言的逃逸阐发(Escape Analysis)了。

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

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

在此次的法式中,Harry确定了逃逸的变量是rule那个构造体(struct)。

Go法式提速42%,只需改动一个字符

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

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

Go法式提速42%,只需改动一个字符

最初处理办法也很随便想出,只需要把挪动到上面。

Go法式提速42%,只需改动一个字符

如许就引用了切片中的构造体,制止了拷贝。

若何彻底制止?

在热议中,有网友分享了本身是怎么制止呈现那个问题的。

关于每个构造体,把它看做纯值或纯指针,压根就不往利用那种取地址的操做,制止隐式的内存分配。

假设你想要深进理解那个问题,也有人贴心的给出了需要提早领会的一些布景常识。

最初有人指出,Rust语言为制止那个问题,间接规定必需显式操做才气拷贝一个数据构造。

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

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

便利or标准,你更倾向于哪种做法?

— 完—

MEET 2023 大会定档!

首批嘉宾阵容公布

量子位「MEET2023智能将来大会」正式定档12月14日!

首批嘉宾包罗 郑纬民院士、MSRA 刘铁岩、阿里 贾扬清、百度 段润尧、高通 Ziad Asghar、小冰 李笛、海潮 刘军以及中关村科金 张杰等来自产学研界大咖嘉宾,更多重磅嘉宾陆续确认中。

点击 “预约”按钮,一键中转大会曲播现场!

点那里存眷我 👇 记得标星噢 ~

一键三连「分享」、「点赞」和「在看」

科技前沿停顿日日相见 ~

0
回帖

Go法式提速42%,只需改动一个字符 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息