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

前言:

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