Compilation Time Slowdown with CGO_ENABLED=0
When developing network-based Go programs, compiling with CGO_ENABLED=0 can result in a significant slowdown compared to CGO_ENABLED=1. This is observed even when no C bindings are employed, as in the case of a basic 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) } }
Compilation times are significantly slower when 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 of the Slowdown
The difference in compilation time arises from the dependency on standard library packages. When CGO_ENABLED=1, these packages are built with the necessary flags, but when CGO_ENABLED=0, they are not.
Standard library packages without flags cannot be used with CGO_ENABLED=0, forcing most of the library to be rebuilt. This significantly increases the compilation time.
Mitigating the Slowdown
One solution is to install pre-built packages with the desired flags using go build -i. However, this approach introduces its own challenges. Installing packages built without CGO_ENABLED=0 speeds up future builds without CGO_ENABLED=0 but slows down builds with CGO_ENABLED=0.
To address this issue, it is advisable to use the -installsuffix and/or -pkgdir flags, which allow for different package installation directories based on the compilation flags used. This enables efficient builds with different flags.
The above is the detailed content of Why is Go compilation slower with `CGO_ENABLED=0` even without C bindings?. For more information, please follow other related articles on the PHP Chinese website!