Heim >Backend-Entwicklung >Golang >Warum verlangsamt die Aktivierung von CGO_ENABLED die Kompilierung, auch ohne C-Bindungen?

Warum verlangsamt die Aktivierung von CGO_ENABLED die Kompilierung, auch ohne C-Bindungen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-26 03:29:08128Durchsuche

Why Does Enabling CGO_ENABLED Slow Down Compilation, Even Without C Bindings?

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!

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