Rumah > Artikel > pembangunan bahagian belakang > Mengapakah kompilasi Go lebih perlahan dengan `CGO_ENABLED=0` walaupun tanpa pengikatan C?
Perlahan Masa Kompilasi dengan CGO_ENABLED=0
Apabila membangunkan program Go berasaskan rangkaian, menyusun dengan CGO_ENABLED=0 boleh mengakibatkan kelembapan yang ketara berbanding dengan CGO_ENABLED=1. Ini diperhatikan walaupun apabila tiada pengikatan C digunakan, seperti dalam kes pelayan HTTP asas:
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) } }
Masa kompilasi jauh lebih perlahan apabila 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
Punca Kelembapan
Perbezaan dalam masa penyusunan timbul daripada pergantungan pada pakej perpustakaan standard. Apabila CGO_ENABLED=1, pakej ini dibina dengan bendera yang diperlukan, tetapi apabila CGO_ENABLED=0, ia tidak.
Pakej perpustakaan standard tanpa bendera tidak boleh digunakan dengan CGO_ENABLED=0, memaksa kebanyakan perpustakaan menjadi dibina semula. Ini meningkatkan masa penyusunan dengan ketara.
Mengurangkan Kelembapan
Satu penyelesaian ialah memasang pakej pra-bina dengan bendera yang dikehendaki menggunakan go build -i. Walau bagaimanapun, pendekatan ini memperkenalkan cabarannya sendiri. Memasang pakej yang dibina tanpa CGO_ENABLED=0 mempercepatkan binaan masa hadapan tanpa CGO_ENABLED=0 tetapi memperlahankan binaan dengan CGO_ENABLED=0.
Untuk menangani isu ini, adalah dinasihatkan untuk menggunakan tanda -installsuffix dan/atau -pkgdir, yang membenarkan direktori pemasangan pakej berbeza berdasarkan bendera kompilasi yang digunakan. Ini membolehkan binaan cekap dengan bendera yang berbeza.
Atas ialah kandungan terperinci Mengapakah kompilasi Go lebih perlahan dengan `CGO_ENABLED=0` walaupun tanpa pengikatan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!