Verlangsamung der Kompilierungszeit mit CGO_ENABLED=0
Bei der Entwicklung netzwerkbezogener Go-Programme kann eine erhebliche Diskrepanz in der Kompilierungsgeschwindigkeit beobachtet werden Builds mit CGO_ENABLED=0 und solche ohne. Dies wird sogar in einem rudimentären HTTP-Server-Beispiel deutlich:
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) } }
Benchmarks zur Kompilierungszeit zeigen eine erhebliche Verlangsamung:
% 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
Obwohl keine direkten C-Bindungen vorhanden sind, bleibt diese Verlangsamung bestehen. Die zugrunde liegende Ursache liegt im Build-Prozess.
Die Rolle von Build-Flags
CGO_ENABLED ist eines von vielen Build-Flags, die während der Kompilierung verwendet werden, um Optimierungen zu konfigurieren und C-Code einzubinden. Wenn dieses Flag auf 0 gesetzt ist, können vorgefertigte Standardbibliothekspakete nicht wiederverwendet werden. Folglich muss ein erheblicher Teil der Standardbibliothek neu kompiliert werden, was zu der beobachteten Verlangsamung führt.
Alternative Ansätze
Bei der Installation vorgefertigter Pakete mit go build -i kann zukünftige Builds mit CGO_ENABLED=0 beschleunigen, das Problem für Builds ohne CGO_ENABLED wird dadurch nicht behoben. Um beide Build-Konfigurationen effizient zu unterstützen, sollten separate Installationsverzeichnisse über die Flags -installsuffix und -pkgdir verwendet werden. Diese Trennung stellt sicher, dass Pakete, die mit unterschiedlichen Flags erstellt wurden, sich nicht gegenseitig überschreiben.
Das obige ist der detaillierte Inhalt vonWarum ist die Kompilierungszeit mit „CGO_ENABLED=0' in Go langsamer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!