即使沒有C 綁定,為什麼CGO_ENABLED 也會減慢編譯速度
創建涉及網路使用的程式時,啟用CGO_ENABLED 進行編譯可能會導致顯著放緩。即使程式不與 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) } }
編譯時間的比較揭示了明顯的差異:
% 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 時,它會更改編譯標誌,這意味著這些預先建置的套件不能再使用。因此,標準函式庫的很大一部分必須重新編譯。
雖然透過 go build -i 安裝軟體包可以緩解這個問題,但它也有其自身的缺點。安裝使用 CGO_ENABLED=0 建置的軟體包將提高未來建置的速度,但也會減慢不使用它的建置速度。
要解決此衝突,請考慮使用 -installsuffix 和/或 -pkgdir 標誌,它為不同的編譯模式建立單獨的目錄,最佳化建置效率並消除與 CGO_ENABLED 編譯相關的延遲。
以上是為什麼即使沒有 C 綁定,啟用 CGO_ENABLED 也會減慢編譯速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!