nikolaydubina/go-binsize-treemap
GitHub: nikolaydubina/go-binsize-treemap
将 Go 二进制文件的符号大小数据可视化为 SVG 矩形树图,帮助开发者直观分析编译产物体积构成。
Stars: 590 | Forks: 18
# 🔍 Go 二进制文件大小 SVG 矩形树图
| go-binsize-treemap > binsize.svg
```
## 免责声明
你应该担心可执行二进制文件的大小吗?
在 2022 年,几秒钟的猫咪视频甚至一张图片就有几十 MB。
通过网络传输它们也不是什么大问题。
所以,可能你不需要太担心这个问题。
然而,这个工具在几种情况下仍然很有用。
- 你正在研究编译器。
- 你正在调查二进制文件中包含了哪些第三方依赖。
- 你正在检查嵌入了多少数据。
- 你正在估计包中包含了多少代码。
- 你正在研究包含了哪些符号。
- 你正在使用 `cgo`。
- 你正在进行矩形树图可视化。
我在业余时间构建了这个工具,作为我之前构建的 Go 矩形树图工具的另一个用例。希望你喜欢!欢迎提交 Issue 或 PR!
## 示例
_ | c++filt | go-binsize-treemap > binsize.svg
```
## 附录 B:大尺寸与丰富细节
如果你将尺寸设置得非常大,你可以看到很多细节并在地图中导航。
推荐使用 4096x4096

... 但你可以设置得更高

## 附录 C:小尺寸与信息预览
你可以生成项目的微缩预览图,例如适合嵌入到 README 中。
推荐使用 1024x256

## 文档
```
$ cat testdata/go-graphviz.symtab | ./go-binsize-treemap -csv > docs/go-graphviz.csv
$ cat testdata/go-graphviz.symtab | ./go-binsize-treemap > docs/go-graphviz.svg
$ cat testdata/go-graphviz.symtab | ./go-binsize-treemap -w 4096 -h 4096 > docs/go-graphviz-4096x4096.svg
$ cat testdata/cockroach.symtab | ./go-binsize-treemap -csv > docs/cockroach.csv
$ cat testdata/cockroach.symtab | ./go-binsize-treemap > docs/cockroach.svg
$ cat testdata/cockroach.symtab | ./go-binsize-treemap -w 4096 -h 4096 > docs/cockroach-4096x4096.svg
$ cat testdata/skipper.symtab | ./go-binsize-treemap > docs/skipper.svg
$ cat testdata/hugo.symtab | ./go-binsize-treemap -csv > docs/hugo.csv
$ cat testdata/hugo.symtab | ./go-binsize-treemap > docs/hugo.svg
$ cat testdata/hugo.symtab | ./go-binsize-treemap -w 1024 -h 128 > docs/hugo-1024x128.svg
$ cat testdata/hugo.symtab | ./go-binsize-treemap -w 1024 -h 256 > docs/hugo-1024x256.svg
$ cat testdata/hugo.symtab | ./go-binsize-treemap -w 1024 -h 512 > docs/hugo-1024x512.svg
$ cat testdata/hugo.symtab | ./go-binsize-treemap -w 4096 -h 4096 > docs/hugo-4096x4096.svg
$ cat testdata/hugo.symtab | ./go-binsize-treemap -w 16384 -h 16384 > docs/hugo-16384x16384.svg
```
✨ 由 NDX AI Shopping Assistant 赞助
[](https://pkg.go.dev/github.com/nikolaydubina/go-binsize-treemap) [](https://codecov.io/gh/nikolaydubina/go-binsize-treemap) [](https://goreportcard.com/report/github.com/nikolaydubina/go-binsize-treemap) [](https://github.com/nikolaydubina/go-recipes) [](https://hits.sh/github.com/nikolaydubina/go-binsize-treemap/) [](https://securityscorecards.dev/viewer/?uri=github.com/nikolaydubina/go-binsize-treemap) ``` $ go install github.com/nikolaydubina/go-binsize-treemap@latest $ go tool nm -sizegithub.com/gohugoio/hugo
_ _62MB,这是一个著名的大型 Go 项目示例
_  _github.com/cockroachdb/cockroach
_ _71MB,这个著名的数据库使用 C++ 构建
_  _github.com/goccy/go-graphviz
_ _6.5MB,该项目包含 CGO,并使用大量 C 语言的 graphviz 代码构建
_  _github.com/zalando/skipper
_ _36MB,这是一个大型 Go 项目,某些构建可能会包含 C
_  ## 知识库 这是接口相关代码。 请参阅 Russ Cox 的这篇[文章](https://research.swtch.com/interfaces)。 正如 Cockroach 团队所调查的,这是用于 trace 的 Go 运行时结构([参考](https://www.cockroachlabs.com/blog/go-file-size/))。 过去在 GitHub [讨论串](https://github.com/golang/go/issues/36313)中关于它为什么这么大以及该怎么做的讨论(嗯,没什么可做的)。 ## 已知问题与待办事项 - [ ] 大小与实际二进制文件大小略有出入。包含未知部分也无济于事。 - [ ] 更好的 C++ 符号名解析 - [ ] 识别 go:embed - [ ] 按类型着色 + 增加亮度 (sys; user; c++; go:embed; 等等) - [ ] 按符号类型着色 - [ ] 热力图依据 ???? ## 相关工作 - https://github.com/knz/go-binsize-viz — 这是本工具的灵感来源。然而,该工具使用的是 Python、D3 和 Javascript,而本工具完全使用纯 Go 技术栈,并且有测试覆盖率。可以说,缺点是它不是交互式的。 - https://github.com/jondot/goweight — 看起来它一开始还能正常工作,但截至 2022-01-22,它对我来说已经不能用了,而且早在 2020-01-23 就有报告指出它不准确。 ## 参考 - https://github.com/knz/go-binsize-viz - https://github.com/jondot/goweight - https://github.com/nikolaydubina/treemap - https://github.com/nikolaydubina/go-cover-treemap - https://github.com/golang/go/blob/master/src/cmd/nm/doc.go - https://linux.die.net/man/1/c++filt - https://github.com/goccy/go-graphviz - https://research.swtch.com/interfaces ## 附录 A:奇怪的输出 / C++ / CGO 你可能需要先对 symtab 文件进行解混淆(demungle)。安装 `c++flit`。然后先处理 symtab。 注意,C++ 支持仍在开发中。 ``` $ go tool nm -size标签:DNS解析, EVTX分析, Go语言, SVG可视化, Treemap, WebSocket, 二进制文件分析, 代码体积, 代码示例, 依赖分析, 开源项目, 性能优化, 数据分析, 日志审计, 检测绕过, 矩形树图, 程序破解, 编译器研究