CGO_ENABLED=0 時編譯時間減慢
開發基於網路的Go 程式時,使用CGO_ENAB=0 進行編譯可能會導致顯示著減慢與CGO_ENABLED=1 相比。即使沒有使用C 綁定,也可以觀察到這種情況,就像基本HTTP 伺服器的情況一樣:
package main import ( "flag" "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi! glad you requested %s.\n", r.URL.Path[1:]) } func main() { port := flag.Int("port", 9000, "") flag.Parse() http.HandleFunc("/", handler) err := http.ListenAndServe(fmt.Sprintf(":%d", *port), nil) if err != nil { log.Fatal(err) } }
當CGO_ENABLED=0 時,編譯時間明顯變慢:
% time go build go build 0.46s user 0.06s system 131% cpu 0.396 total % time CGO_ENABLED=0 go build CGO_ENABLED=0 go build 3.93s user 0.15s system 143% cpu 2.849 total
速度變慢的原因
編譯時間的差異源自於對標準函式庫包的依賴。當 CGO_ENABLED=1 時,這些套件是使用必要的標誌建構的,但當 CGO_ENABLED=0 時,它們不是。
沒有標誌的標準庫包不能與 CGO_ENABLED=0 一起使用,迫使大多數庫被重建。這會顯著增加編譯時間。
緩解速度
一種解決方案是使用 go build -i 安裝具有所需標誌的預建套件。然而,這種方法也帶來了自身的挑戰。安裝沒有 CGO_ENABLED=0 建置的軟體套件可以加快未來沒有 CGO_ENABLED=0 的建置速度,但會減慢 CGO_ENABLED=0 的建置速度。
要解決此問題,建議使用 -installsuffix 和/或 -pkgdir 標誌,它允許根據使用的編譯標誌使用不同的套件安裝目錄。這可以使用不同的標誌進行高效構建。
以上是為什麼即使沒有 C 綁定,使用「CGO_ENABLED=0」Go 編譯也會變慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!