Heim >Backend-Entwicklung >Golang >Warum verlangsamt die Aktivierung von CGO_ENABLED die Kompilierung, auch ohne C-Bindungen?
Warum CGO_ENABLED die Kompilierung verlangsamen kann, auch ohne C-Bindungen
Beim Erstellen von Programmen, die eine Netzwerknutzung erfordern, kann die Aktivierung von CGO_ENABLED für die Kompilierung zu Problemen führen eine deutliche Verlangsamung. Dies geschieht auch dann, wenn das Programm nicht mit C-Code interagiert. Betrachten Sie den folgenden einfachen HTTP-Server:
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) } }
Ein Vergleich der Kompilierungszeiten zeigt einen krassen Unterschied:
% 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
Der Grund dafür ist, dass Pakete in der Standardbibliothek ohne Flags kompiliert werden . Wenn CGO_ENABLED gesetzt ist, werden die Kompilierungsflags geändert, was bedeutet, dass diese vorgefertigten Pakete nicht mehr verwendet werden können. Daher muss ein großer Teil der Standardbibliothek neu kompiliert werden.
Die Installation von Paketen über go build -i kann dieses Problem zwar beheben, bringt aber auch seine eigenen Nachteile mit sich. Die Installation von Paketen, die mit CGO_ENABLED=0 erstellt wurden, erhöht die Geschwindigkeit zukünftiger Builds, verlangsamt aber auch Builds, die es nicht verwenden.
Um diesen Konflikt zu lösen, sollten Sie die Verwendung der Flags -installsuffix und/oder -pkgdir in Betracht ziehen. Dadurch werden separate Verzeichnisse für verschiedene Kompilierungsmodi erstellt, wodurch die Build-Effizienz optimiert und die mit dem Kompilieren mit CGO_ENABLED verbundene Verzögerung vermieden wird.
Das obige ist der detaillierte Inhalt vonWarum verlangsamt die Aktivierung von CGO_ENABLED die Kompilierung, auch ohne C-Bindungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!