3 回答

TA貢獻1777條經(jīng)驗 獲得超3個贊
您可以通過查看目錄來查看庫二進制文件有多大$GOPATH/pkg(如果$GOPATH未導(dǎo)出go則默認為$HOME/go)。
所以要檢查一些 http pkgs 的大小gorilla。首先安裝它們:
$ go get -u github.com/gorilla/mux
$ go get -u github.com/gorilla/securecookie
$ go get -u github.com/gorilla/sessions
我的 64 位 MacOS ( darwin_amd64) 上的 KB 二進制大?。?/p>
$ cd $GOPATH/pkg/darwin_amd64/github.com/gorilla/
$ du -k *
284 mux.a
128 securecookie.a
128 sessions.a
編輯:
庫(包)大小是一回事,但在鏈接階段后可執(zhí)行文件中占用的空間大小可能會有很大差異。這是因為包有自己的依賴關(guān)系,隨之而來的是額外的包袱,但這些包袱可能會被您導(dǎo)入的其他包共享。
一個例子最好地證明了這一點:
空去:
package main
func main() {}
http.go:
package main
import "net/http"
var _ = http.Serve
func main() {}
mux.go:
package main
import "github.com/gorilla/mux"
var _ = mux.NewRouter
func main() {}
所有 3 個程序在功能上都是相同的——執(zhí)行零用戶代碼——但它們的依賴關(guān)系不同。生成的二進制大小為KB:
$ du -k *
1028 empty
5812 http
5832 mux
這告訴我們什么?核心 go pkgnet/http顯著增加了我們的可執(zhí)行文件的大小。pkgmux本身并不大,但它對 net/httppkg 具有導(dǎo)入依賴性 - 因此它的文件大小也很大。mux然而和之間的差異http僅為20KB,而列出的 mux.a 庫文件大小為284KB. 所以我們不能簡單地添加庫 pkg 大小來確定它們的真實足跡。
結(jié)論: 在構(gòu)建過程中,go 鏈接器會從各個庫中剝離大量包袱,但為了真正了解導(dǎo)入某些包的額外重量,我們必須查看 pkg 的所有子依賴項出色地。

TA貢獻1712條經(jīng)驗 獲得超3個贊
package main
import (
? ? "flag"
? ? "fmt"
? ? "log"
? ? "os"
? ? "sort"
? ? "golang.org/x/tools/go/packages"
)
func main() {
? ? flag.Parse()
? ? // Many tools pass their command-line arguments (after any flags)
? ? // uninterpreted to packages.Load so that it can interpret them
? ? // according to the conventions of the underlying build system.
? ? cfg := &packages.Config{Mode: packages.NeedFiles |
? ? ? ? packages.NeedSyntax |
? ? ? ? packages.NeedImports,
? ? }
? ? pkgs, err := packages.Load(cfg, flag.Args()...)
? ? if err != nil {
? ? ? ? fmt.Fprintf(os.Stderr, "load: %v\n", err)
? ? ? ? os.Exit(1)
? ? }
? ? if packages.PrintErrors(pkgs) > 0 {
? ? ? ? os.Exit(1)
? ? }
? ? // Print the names of the source files
? ? // for each package listed on the command line.
? ? var size int64
? ? for _, pkg := range pkgs {
? ? ? ? for _, file := range pkg.GoFiles {
? ? ? ? ? ? s, err := os.Stat(file)
? ? ? ? ? ? if err != nil {
? ? ? ? ? ? ? ? log.Println(err)
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? }
? ? ? ? ? ? size += s.Size()
? ? ? ? }
? ? }
? ? fmt.Printf("size of %v is %v b\n", pkgs[0].ID, size)
? ? size = 0
? ? for _, pkg := range allPkgs(pkgs) {
? ? ? ? for _, file := range pkg.GoFiles {
? ? ? ? ? ? s, err := os.Stat(file)
? ? ? ? ? ? if err != nil {
? ? ? ? ? ? ? ? log.Println(err)
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? }
? ? ? ? ? ? size += s.Size()
? ? ? ? }
? ? }
? ? fmt.Printf("size of %v and deps is %v b\n", pkgs[0].ID, size)
}
func allPkgs(lpkgs []*packages.Package) []*packages.Package {
? ? var all []*packages.Package // postorder
? ? seen := make(map[*packages.Package]bool)
? ? var visit func(*packages.Package)
? ? visit = func(lpkg *packages.Package) {
? ? ? ? if !seen[lpkg] {
? ? ? ? ? ? seen[lpkg] = true
? ? ? ? ? ? // visit imports
? ? ? ? ? ? var importPaths []string
? ? ? ? ? ? for path := range lpkg.Imports {
? ? ? ? ? ? ? ? importPaths = append(importPaths, path)
? ? ? ? ? ? }
? ? ? ? ? ? sort.Strings(importPaths) // for determinism
? ? ? ? ? ? for _, path := range importPaths {
? ? ? ? ? ? ? ? visit(lpkg.Imports[path])
? ? ? ? ? ? }
? ? ? ? ? ? all = append(all, lpkg)
? ? ? ? }
? ? }
? ? for _, lpkg := range lpkgs {
? ? ? ? visit(lpkg)
? ? }
? ? return all
}

TA貢獻1810條經(jīng)驗 獲得超5個贊
您可以使用 下載所有imported 模塊,然后計算所有不是測試文件的文件go mod vendor的行數(shù):.go
package main
import (
"bytes"
"fmt"
"io/fs"
"os"
"os/exec"
"path/filepath"
"strings"
)
func count(mod string) int {
imp := fmt.Sprintf("package main\nimport _ %q", mod)
os.WriteFile("size.go", []byte(imp), os.ModePerm)
exec.Command("go", "mod", "init", "size").Run()
exec.Command("go", "mod", "vendor").Run()
var count int
filepath.WalkDir("vendor", func(s string, d fs.DirEntry, err error) error {
if strings.HasSuffix(s, ".go") && !strings.HasSuffix(s, "_test.go") {
data, err := os.ReadFile(s)
if err != nil {
return err
}
count += bytes.Count(data, []byte{'\n'})
}
return nil
})
return count
}
func main() {
println(count("github.com/klauspost/compress/zstd"))
}
- 3 回答
- 0 關(guān)注
- 267 瀏覽