Heim  >  Artikel  >  Backend-Entwicklung  >  Warum ist die Kompilierungszeit mit „CGO_ENABLED=0“ in Go langsamer?

Warum ist die Kompilierungszeit mit „CGO_ENABLED=0“ in Go langsamer?

DDD
DDDOriginal
2024-11-07 09:33:03666Durchsuche

Why is Compilation Time Slower with `CGO_ENABLED=0` in Go?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn