Golang Go语言改一行文件也要编译一次要30s

发布于 1周前 作者 phonegap100 来自 Go语言

Golang Go语言改一行文件也要编译一次要30s

项目是分拆到多个仓库的那种,然后会 import 很多公共的 pb, 编译完之后的文件有 366M。。。我看 import 的包都被 cache 了,卡在 link 的时间比较长。这个是什么原因?符号太多?

go build -v -x -ldflags="-v=2" .

最后的输出

12.08 symsize = 0 14.13 pclntab=96705222 bytes, funcdata total 22521356 bytes 14.73 dodata 14.94 symsize = 0 15.10 symsize = 0 15.73 dynreloc 16.19 dwarf 22.82 asmb 22.82 codeblk 23.84 datblk 23.93 reloc 25.26 sym 25.26 headr 25.36 cpu time 4611380 symbols 3060492 liveness data

然后会有很多 mark text, 和 removing method 条目打出来。。。

有大佬懂得吗


更多关于Golang Go语言改一行文件也要编译一次要30s的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

24 回复

30 秒还想怎样?换成是 llvm / gcc 的,这么大的项目,可能得 30 分钟。

更多关于Golang Go语言改一行文件也要编译一次要30s的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


366M ?这是把一些资源都内置进去了?

366M 的话 30s 真的很快了…

一直在想,如果 linux 软件大部分用 go 重写(当然不可能),那肯定是 Gentoo 的春天。

可能被 golang 惯坏了, 试试 rust // golang 有编译缓存的, 应该是大量 pb 的原因

begoo 有个 fsnotify

import 了什么玩意儿,三百兆,好好检查一下,少用私人库

很想知道什么项目编译完要 300 多 M

想知道你源码多大

你这至少要 100w 行代码编译吧?

web 项目才是痛苦 改点东西就得重启,没法热更新

rust release 模式的话得 2 小时不止

web 项目基本无状态,重启就重启吧,反正可以自动实现

什么项目居然要 2 小时。。。厉害厉害

c++ 界的解决办法:动态链接

估计编译了一堆 assets

感觉比 cpp 快。。。

拆成 go plugin 用链接 so 的方法可能可以把需要重新编译的部分减少

可以呀,为什么不能热更新?

没成熟的吧,比如我的二进制运行需要 10s 才会启动好,如果热更新?
就算用老的二进制顶住,在启动新的二进制文件的时候,老的要退出,10s 的时间访问就会有问题

参考 k8s 的 liveness、readiness 探针

在Go语言(Golang)开发中,确实存在每次修改文件后都需要重新编译整个项目的情况,这可能会导致较长的编译时间,尤其是当项目规模较大时。针对你提到的编译一次需要30秒的问题,这里有几个可能的优化建议:

  1. 增量编译:确保你使用的是Go的增量编译功能。Go的编译器已经对增量编译做了优化,但效果可能因项目结构和依赖关系而异。

  2. 缓存利用:Go的编译过程会利用缓存来加速编译。确保你的构建环境(如$GOPATH$GOCACHE)没有被频繁清理,以便充分利用缓存。

  3. 依赖管理:检查项目的依赖关系,确保没有不必要的依赖导致编译时间延长。使用Go Modules来管理依赖,可以帮助减少不必要的重新编译。

  4. 并行编译:Go支持并行编译,可以通过设置环境变量GOMAXPROCS来增加并行编译的CPU核心数,从而加快编译速度。

  5. 代码结构优化:如果可能,尝试优化代码结构,减少包之间的依赖,这有助于减少编译时需要检查的文件数量。

  6. 硬件升级:如果上述方法都无法显著改善编译时间,可能需要考虑升级硬件,特别是增加更快的CPU和更多的内存。

如果问题依然存在,建议详细分析编译日志,找出编译过程中的瓶颈,或者考虑使用更高效的构建工具或脚本。

回到顶部