首頁 >後端開發 >Golang >為什麼即使沒有 C 綁定,啟用 CGO_ENABLED 也會減慢編譯速度?

為什麼即使沒有 C 綁定,啟用 CGO_ENABLED 也會減慢編譯速度?

Patricia Arquette
Patricia Arquette原創
2024-11-26 03:29:08189瀏覽

Why Does Enabling CGO_ENABLED Slow Down Compilation, Even Without C Bindings?

即使沒有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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn