Heim > Artikel > Backend-Entwicklung > Warum ist die Go-Kompilierung mit „CGO_ENABLED=0“ auch ohne C-Bindungen langsamer?
Verlangsamung der Kompilierungszeit mit CGO_ENABLED=0
Bei der Entwicklung netzwerkbasierter Go-Programme kann das Kompilieren mit CGO_ENABLED=0 zu einer erheblichen Verlangsamung führen im Vergleich zu CGO_ENABLED=1. Dies wird auch dann beobachtet, wenn keine C-Bindungen verwendet werden, wie im Fall eines einfachen HTTP-Servers:
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) } }
Kompilierungszeiten sind deutlich langsamer, wenn 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
Ursachen für die Verlangsamung
Der Unterschied in der Kompilierungszeit ergibt sich aus der Abhängigkeit von Standardbibliothekspaketen. Bei CGO_ENABLED=1 werden diese Pakete mit den erforderlichen Flags erstellt, bei CGO_ENABLED=0 jedoch nicht.
Standardbibliothekspakete ohne Flags können nicht mit CGO_ENABLED=0 verwendet werden, was die meisten Bibliotheken dazu zwingt wieder aufgebaut. Dies erhöht die Kompilierungszeit erheblich.
Abmildern der Verlangsamung
Eine Lösung besteht darin, vorgefertigte Pakete mit den gewünschten Flags mithilfe von go build -i zu installieren. Dieser Ansatz bringt jedoch seine eigenen Herausforderungen mit sich. Die Installation von Paketen, die ohne CGO_ENABLED=0 erstellt wurden, beschleunigt zukünftige Builds ohne CGO_ENABLED=0, verlangsamt jedoch Builds mit CGO_ENABLED=0.
Um dieses Problem zu beheben, ist es ratsam, die Flags -installsuffix und/oder -pkgdir zu verwenden. Dies ermöglicht unterschiedliche Paketinstallationsverzeichnisse basierend auf den verwendeten Kompilierungsflags. Dies ermöglicht effiziente Builds mit unterschiedlichen Flags.
Das obige ist der detaillierte Inhalt vonWarum ist die Go-Kompilierung mit „CGO_ENABLED=0“ auch ohne C-Bindungen langsamer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!