Maison >développement back-end >Golang >Pourquoi l'activation de CGO_ENABLED ralentit-elle la compilation, même sans liaisons C ?

Pourquoi l'activation de CGO_ENABLED ralentit-elle la compilation, même sans liaisons C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-26 03:29:08138parcourir

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

Pourquoi CGO_ENABLED peut ralentir la compilation, même sans liaisons C

Lors de la création de programmes impliquant une utilisation du réseau, l'activation de CGO_ENABLED pour la compilation peut entraîner un ralentissement important. Cela se produit même si le programme n'interagit pas avec le code C. Considérons le simple serveur HTTP suivant :

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)
    }
}

Une comparaison des temps de compilation révèle une différence marquée :

% 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

La raison en est que les packages de la bibliothèque standard sont compilés sans indicateurs . Lorsque CGO_ENABLED est défini, cela modifie les indicateurs de compilation, ce qui signifie que ces packages prédéfinis ne peuvent plus être utilisés. Par conséquent, une grande partie de la bibliothèque standard doit être recompilée.

Lors de l'installation de packages via go build -i, je peux atténuer ce problème, mais cela présente ses propres inconvénients. L'installation de packages construits avec CGO_ENABLED=0 améliorera la vitesse des futures builds, mais cela ralentira également les builds qui ne l'utilisent pas.

Pour résoudre ce conflit, envisagez d'utiliser les indicateurs -installsuffix et/ou -pkgdir, qui créent des répertoires séparés pour différents modes de compilation, optimisant l'efficacité de la construction et éliminant le retard associé à la compilation avec CGO_ENABLED.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn