跟進如何檢查 Go 專案的大小?
結論是:
為了真正了解匯入某些包有多少額外的重量,還必須查看 pkg 的所有子依賴項。
這是完全可以理解的。我的問題是,
無論如何,我是否可以知道每個組件在我編譯的二進制檔案、Go 運行時、依賴項和子依賴項包以及我自己的代碼中占用了多少空間。
我依稀記得以前讀過類似的東西(也許當 go 增強了它的聯結器時)。
如果以前從未有過這樣的討論,那么 go 甚至 c 聯結器有什么辦法可以查看我編譯的二進制檔案,并揭示一些我可以進一步決議的內容嗎?
uj5u.com熱心網友回復:
二進制檔案將包含除錯符號,我們可以使用它來計算每個包占用多少空間。
我撰寫了一個基本程式來執行此操作,因為我不知道有任何工具可以執行此操作:
package main
import (
"debug/elf"
"fmt"
"os"
"runtime"
"sort"
"strings"
"github.com/go-delve/delve/pkg/proc"
)
func main() {
// Use delve to decode the DWARF section
binInfo := proc.NewBinaryInfo(runtime.GOOS, runtime.GOARCH)
err := binInfo.AddImage(os.Args[1], 0)
if err != nil {
panic(err)
}
// Make a list of unique packages
pkgs := make([]string, 0, len(binInfo.PackageMap))
for _, fullPkgs := range binInfo.PackageMap {
for _, fullPkg := range fullPkgs {
exists := false
for _, pkg := range pkgs {
if fullPkg == pkg {
exists = true
break
}
}
if !exists {
pkgs = append(pkgs, fullPkg)
}
}
}
// Sort them for a nice output
sort.Strings(pkgs)
// Parse the ELF file ourselfs
elfFile, err := elf.Open(os.Args[1])
if err != nil {
panic(err)
}
// Get the symbol table
symbols, err := elfFile.Symbols()
if err != nil {
panic(err)
}
usage := make(map[string]map[string]int)
for _, sym := range symbols {
if sym.Section == elf.SHN_UNDEF || sym.Section >= elf.SectionIndex(len(elfFile.Sections)) {
continue
}
sectionName := elfFile.Sections[sym.Section].Name
symPkg := ""
for _, pkg := range pkgs {
if strings.HasPrefix(sym.Name, pkg) {
symPkg = pkg
break
}
}
// Symbol doesn't belong to a known package
if symPkg == "" {
continue
}
pkgStats := usage[symPkg]
if pkgStats == nil {
pkgStats = make(map[string]int)
}
pkgStats[sectionName] = int(sym.Size)
usage[symPkg] = pkgStats
}
for _, pkg := range pkgs {
sections, exists := usage[pkg]
if !exists {
continue
}
fmt.Printf("%s:\n", pkg)
for section, size := range sections {
fmt.Printf("s:
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/417950.html
標籤:
