首頁  >  文章  >  後端開發  >  為什麼 Go 中使用 `CGO_ENABLED=0` 編譯時間會變慢?

為什麼 Go 中使用 `CGO_ENABLED=0` 編譯時間會變慢?

DDD
DDD原創
2024-11-07 09:33:03661瀏覽

Why is Compilation Time Slower with `CGO_ENABLED=0` in Go?

CGO_ENABLED=0 時編譯時間變慢

在開發與網路相關的Go 程式時,可以觀察到編譯速度有顯著差異使用CGO_ENABLED=0 和不使用CGO_ENABLED=0 進行建構。即使在基本的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

儘管沒有任何直接的C綁定,但這種減慢仍然存在。根本原因在於建置過程。

建置標誌的作用

CGO_ENABLED 是編譯期間用於設定最佳化和包含 C 程式碼的眾多建置標誌之一。當此標誌設定為 0 時,無法重複使用預先建置的標準庫包。因此,標準函式庫的很大一部分必須重新編譯,從而導致觀察到的速度變慢。

替代方法

使用go build -i 安裝預構建的包時可以使用CGO_ENABLED=0 加速未來的構建,但它不能解決沒有CGO_ENABLED 的構建的問題。為了有效地支援這兩種建置配置,應透過 -installsuffix 和 -pkgdir 標誌使用單獨的安裝目錄。這種隔離確保使用不同標誌建構的套件不會相互覆蓋。

以上是為什麼 Go 中使用 `CGO_ENABLED=0` 編譯時間會變慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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