Why CGO_ENABLED Can Slow Down Compilation, Even Without C Bindings
When creating programs that involve network usage, enabling CGO_ENABLED for compilation can result in a significant slowdown. This happens even if the program does not interact with C code. Consider the following simple 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) } }
A comparison of compilation times reveals a stark difference:
% 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
The reason for this is that packages in the standard library are compiled without flags. When CGO_ENABLED is set, it changes the compilation flags, which means that these pre-built packages can no longer be used. Hence, a large portion of the standard library must be recompiled.
While installing packages via go build -i can alleviate this issue, it comes with its own drawbacks. Installing packages built with CGO_ENABLED=0 will enhance the speed of future builds, but it will also slow down builds that do not use it.
To resolve this conflict, consider using -installsuffix and/or -pkgdir flags, which create separate directories for different compilation modes, optimizing build efficiency and eliminating the delay associated with compiling with CGO_ENABLED.
The above is the detailed content of Why Does Enabling CGO_ENABLED Slow Down Compilation, Even Without C Bindings?. For more information, please follow other related articles on the PHP Chinese website!