Ralentissement du temps de compilation avec CGO_ENABLED=0
Lors du développement de programmes Go basés sur le réseau, la compilation avec CGO_ENABLED=0 peut entraîner un ralentissement important par rapport à CGO_ENABLED=1. Ceci s'observe même lorsqu'aucune liaison C n'est utilisée, comme dans le cas d'un serveur HTTP de base :
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 temps de compilation sont nettement plus lents lorsque 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
Causes du ralentissement
La différence de temps de compilation provient de la dépendance aux packages de bibliothèques standards. Lorsque CGO_ENABLED=1, ces packages sont construits avec les indicateurs nécessaires, mais lorsque CGO_ENABLED=0, ils ne le sont pas.
Les packages de bibliothèque standard sans indicateurs ne peuvent pas être utilisés avec CGO_ENABLED=0, ce qui oblige la plupart de la bibliothèque à être reconstruit. Cela augmente considérablement le temps de compilation.
Atténuer le ralentissement
Une solution consiste à installer des packages prédéfinis avec les indicateurs souhaités à l'aide de go build -i. Cependant, cette approche présente ses propres défis. L'installation de packages construits sans CGO_ENABLED=0 accélère les futures builds sans CGO_ENABLED=0 mais ralentit les builds avec CGO_ENABLED=0.
Pour résoudre ce problème, il est conseillé d'utiliser les indicateurs -installsuffix et/ou -pkgdir, qui permettent différents répertoires d'installation de packages en fonction des indicateurs de compilation utilisés. Cela permet des builds efficaces avec différents indicateurs.
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!