Ralentissement du temps de compilation avec CGO_ENABLED=0
Lors du développement de programmes Go liés au réseau, un écart important dans la vitesse de compilation peut être observé entre construit avec CGO_ENABLED=0 et ceux sans. Cela est évident même dans un exemple de serveur HTTP rudimentaire :
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) } }
Les tests de temps de compilation révèlent un ralentissement substantiel :
% 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
Malgré l'absence de liaisons C directes, ce ralentissement persiste. La cause sous-jacente réside dans le processus de construction.
Le rôle des indicateurs de construction
CGO_ENABLED est l'un des nombreux indicateurs de construction utilisés lors de la compilation pour configurer les optimisations et inclure du code C. Lorsque cet indicateur est défini sur 0, les packages de bibliothèques standard prédéfinis ne peuvent pas être réutilisés. Par conséquent, une partie substantielle de la bibliothèque standard doit être recompilée, ce qui entraîne le ralentissement observé.
Approches alternatives
Lors de l'installation de packages pré-construits avec go build -i peut accélérer les futures builds avec CGO_ENABLED=0, cela ne résout pas le problème des builds sans CGO_ENABLED. Pour prendre en charge efficacement les deux configurations de build, des répertoires d'installation distincts doivent être utilisés via les indicateurs -installsuffix et -pkgdir. Cette ségrégation garantit que les packages construits avec des indicateurs différents ne s'écrasent pas.
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!