首頁 > 後端開發 > Golang > 為什麼即使沒有 C 綁定,使用「CGO_ENABLED=0」Go 編譯也會變慢?

為什麼即使沒有 C 綁定,使用「CGO_ENABLED=0」Go 編譯也會變慢?

Linda Hamilton
發布: 2024-11-07 00:25:02
原創
860 人瀏覽過

Why is Go compilation slower with `CGO_ENABLED=0` even without C bindings?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板