Golang Go语言改一行文件也要编译一次要30s
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
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 项目才是痛苦 改点东西就得重启,没法热更新
golang 也有 plugin, https://golang.org/pkg/plugin/
rust release 模式的话得 2 小时不止
web 项目基本无状态,重启就重启吧,反正可以自动实现
什么项目居然要 2 小时。。。厉害厉害
c++ 界的解决办法:动态链接
估计编译了一堆 assets
感觉比 cpp 快。。。
拆成 go plugin 用链接 so 的方法可能可以把需要重新编译的部分减少
没成熟的吧,比如我的二进制运行需要 10s 才会启动好,如果热更新?
就算用老的二进制顶住,在启动新的二进制文件的时候,老的要退出,10s 的时间访问就会有问题
可以
参考 k8s 的 liveness、readiness 探针
在Go语言(Golang)开发中,确实存在每次修改文件后都需要重新编译整个项目的情况,这可能会导致较长的编译时间,尤其是当项目规模较大时。针对你提到的编译一次需要30秒的问题,这里有几个可能的优化建议:
-
增量编译:确保你使用的是Go的增量编译功能。Go的编译器已经对增量编译做了优化,但效果可能因项目结构和依赖关系而异。
-
缓存利用:Go的编译过程会利用缓存来加速编译。确保你的构建环境(如
$GOPATH
或$GOCACHE
)没有被频繁清理,以便充分利用缓存。 -
依赖管理:检查项目的依赖关系,确保没有不必要的依赖导致编译时间延长。使用Go Modules来管理依赖,可以帮助减少不必要的重新编译。
-
并行编译:Go支持并行编译,可以通过设置环境变量
GOMAXPROCS
来增加并行编译的CPU核心数,从而加快编译速度。 -
代码结构优化:如果可能,尝试优化代码结构,减少包之间的依赖,这有助于减少编译时需要检查的文件数量。
-
硬件升级:如果上述方法都无法显著改善编译时间,可能需要考虑升级硬件,特别是增加更快的CPU和更多的内存。
如果问题依然存在,建议详细分析编译日志,找出编译过程中的瓶颈,或者考虑使用更高效的构建工具或脚本。