7

如何提高golang项目的编译速度

 3 years ago
source link: http://xiaorui.cc/archives/6899
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如何提高golang项目的编译速度 – 峰云就她了

专注于Golang、Python、DB、cluster

go1.15beta一出来,腾讯云的朋友就通知到我,官方doc里有说提高了编译速度?我目前在做容器云调度相关的项目,由于中间引入了各种k8s、rancher、中间件的库,编译速度着实太慢,在16寸标压cpu的mac下也需要16s,而40c的服务器则需要18s。😁

为什么要优化?

这是一个好问题呀。如果正常上线20s的编译时间无所谓。但开发期间测试期间,每次一个小修改都需要20秒才能启动,TM 真心受不了。😭

如何优化?

优化golang项目的编译速度刻不容缓,当然这里的优化不是指优化go编译器代码,而是从其他途径优化。

第一步,拆解

容器云管理端是分服务端和客户端的。

服务端作为master主控角色,可以把独立一体式的功能拆分多角色。但客户端要部署到每个物理主机上,为了减少维护的复杂性及稳定性,所以不做拆解。

golang rancher k8s

第二步,golang plugin

由于容器云项目集成了阉割版的prometheus、二次开发的node exportor、魔改的rancher等组件,这些组件跟容器云无太紧密的数据交互,所以我都单独拆分并编译成golang plugin。

容器云客户端把非紧密的功能拆分出去,然后编译成plugin插件使用。这样主代码编译速度从16s到了9s。 ( 😅 代码都拆离了,能不快么 )

plugin还可以动态更新,热加载,代码解耦方面。开始用plugin只是为了解决容器云里需要热插拔的逻辑,后来才因编译速度把其他组件也打成了plugin。

先前写了一个go node_exportoer plugin的例子,有兴趣的朋友可以看看。

https://github.com/rfyiamcool/node-exporter-plugin

第三步,等待golang 1.15 release

go team一直在调优go编译器,在go1.10实现了golang build cache,该编译缓存也是默认开启的。后续1.12和1.13做了小范围的优化,目前go1.15beta已经出来了,经过我的测试得出,go1.15编译速度着实加快了不少。

下面是两个版本的对比,粗略看结果可得出 go1.15要比1.14快了20%左右。两个版本在编译期间的cpu表现来说,go1.15的cpu消耗更大一些。

go 1.14.4

// xiaorui.cc

time go1.15beta build cmd/master/main.go
go1.15beta build cmd/master/main.go  10.84s user 1.76s system 172% cpu 7.314 total time go1.15beta build cmd/master/main.go
go1.15beta build cmd/master/main.go  11.40s user 2.00s system 177% cpu 7.554 total

time go1.15beta build cmd/master/main.go
go1.15beta build cmd/master/main.go  11.53s user 1.84s system 180% cpu 7.410 total time go1.15beta build cmd/master/main.go
go1.15beta build cmd/master/main.go  10.94s user 1.95s system 179% cpu 7.193 total

$ time go1.15beta build cmd/master/main.go
go1.15beta build cmd/master/main.go  11.54s user 1.82s system 180% cpu 7.390 total

golang 1.15 beta

// xiaorui.cc

time go build cmd/master/main.go
go build cmd/master/main.go  11.65s user 1.63s system 144% cpu 9.196 total time go build cmd/master/main.go
go build cmd/master/main.go  11.91s user 1.73s system 137% cpu 9.935 total

time go build cmd/master/main.go
go build cmd/master/main.go  11.87s user 1.86s system 138% cpu 9.945 total time go build cmd/master/main.go
go build cmd/master/main.go  11.66s user 1.73s system 143% cpu 9.306 total

$ time go build cmd/master/main.go
go build cmd/master/main.go  11.52s user 1.76s system 136% cpu 9.754 total

golang plugin是有局限性的,业务代码不适合用。服务的组件拆分看起来更靠谱点。


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc
weixin_new.jpg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK