在 Go 圈子里,应用程序的二进制大小始终是一个热门话题。在追求极致性能的今天,每一个字节都至关重要。Go语言以其简洁高效著称,但随着项目规模的增长,二进制文件的体积也可能随之膨胀。在这篇文章中,我会介绍如何使用 go-size-analyzer 并阅读获得的结果。
安装方式
项目托管在 GitHub 上,可以访问 github.com/Zxilly/go-s… 阅读完整文档。
go-size-analyzer 提供了预编译版本,你可以从 GitHub Release 下载,同时,某些包管理器也可用:
-
Homebrew(MacOS/Linux):
brew install go-size-analyzer -
Scoop(Windows):
scoop install go-size-analyzer -
Go 编译安装:
go install github.com/Zxilly/go-size-analyzer/cmd/gsa@latest编译安装的版本需要在运行时从 GitHub 下载需要的资源文件,这些资源文件在预编译版本中已经被嵌入。
使用方式
执行 gsa --version,确保 go-size-analyzer 已经被正确安装。
找到你要分析的二进制,这里我们选择 cockroachDB 的 linux x86_64 版本。
gsa --web cockroach-linux-amd64
等待命令行显示
使用浏览器访问 http://localhost:8080,会看到
如果说这是一个自己的项目,我们可以点击左侧的包名查看具体细节。是否某个几乎没有被用到的依赖占据了大量体积?embed 是否嵌入了额外的文件?
但是更简单的方式是查看右侧的 section,我们可以看到 .debug_* 段占据了大量的空间。
使用 go tool link --help 可以查看 GoLang 的链接器的具体参数,其中包括
-s disable symbol table
-strictdups int
sanity check duplicate symbol contents during object file reading (1=warn 2=err).
-tmpdir directory
use directory for temporary files
-v print link trace
-w disable DWARF generation
也就是说,使用 -s -w 参数可以删除 .symtab 和 .debug_* 段,在这个二进制文件中,这两个参数可以节省约 40M 的空间。
编译时如果想传递参数给 linker,可以使用 -ldflags 参数,最后完整的命令如 go build -ldflags="-s -w"。
总结
在这篇文章中,介绍了如何使用 go-size-analyzer 工具来分析 Go 应用程序的二进制文件大小。通过这个工具,能够可视化地看到程序中各个部分所占用的空间,并识别出可以优化的部分。我们发现,在许多情况下,.debug_* 段占用了相当大的空间,而通过使用 Go 链接器的 -s -w 参数,能够显著减小二进制文件的大小。
如果你发现这个工具对你有帮助,不妨访问我的 GitHub 仓库 github.com/Zxilly/go-s… 并给它一个 star。你的支持对我来说非常重要,它不仅能激励我继续改进这个工具,也能让更多人了解到这个有用的资源。