Perlahan dalam Masa Kompilasi dengan CGO_ENABLED=0
Apabila membangunkan program Go berkaitan rangkaian, percanggahan ketara dalam kelajuan kompilasi boleh diperhatikan antara membina dengan CGO_ENABLED=0 dan yang tidak. Ini terbukti walaupun dalam contoh 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) } }
Tanda aras masa kompilasi mendedahkan kelembapan yang ketara:
% 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
Walaupun tiada sebarang pengikatan C langsung, kelembapan ini berterusan. Punca asas terletak pada proses binaan.
Peranan Bendera Bina
CGO_ENABLED ialah salah satu daripada banyak bendera binaan yang digunakan semasa penyusunan untuk mengkonfigurasi pengoptimuman dan memasukkan kod C. Apabila bendera ini ditetapkan kepada 0, pakej perpustakaan standard pra-bina tidak boleh digunakan semula. Akibatnya, sebahagian besar perpustakaan standard mesti disusun semula, membawa kepada kelembapan yang diperhatikan.
Pendekatan Alternatif
Semasa memasang pakej pra-bina dengan go build -i boleh mempercepatkan binaan masa hadapan dengan CGO_ENABLED=0, ia tidak menangani isu untuk binaan tanpa CGO_ENABLED. Untuk menyokong kedua-dua konfigurasi binaan dengan cekap, direktori pemasangan yang berasingan harus digunakan melalui bendera -installsuffix dan -pkgdir. Pengasingan ini memastikan pakej yang dibina dengan bendera yang berbeza tidak menimpa satu sama lain.
Atas ialah kandungan terperinci Mengapa Masa Kompilasi Lebih Lambat dengan `CGO_ENABLED=0` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!