Heim >Backend-Entwicklung >Golang >Warum ist die Go-Kompilierung mit „CGO_ENABLED=0' auch ohne C-Bindungen langsamer?

Warum ist die Go-Kompilierung mit „CGO_ENABLED=0' auch ohne C-Bindungen langsamer?

Linda Hamilton
Linda HamiltonOriginal
2024-11-07 00:25:02858Durchsuche

Why is Go compilation slower with `CGO_ENABLED=0` even without C bindings?

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!

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