即使没有 C 绑定,为什么 CGO_ENABLED 也会减慢编译速度
创建涉及网络使用的程序时,启用 CGO_ENABLED 进行编译可能会导致显着放缓。即使程序不与 C 代码交互,也会发生这种情况。考虑以下简单的 HTTP 服务器:
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) } }
编译时间的比较揭示了明显的差异:
% 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
原因是标准库中的包是在没有标志的情况下编译的。当设置 CGO_ENABLED 时,它会更改编译标志,这意味着这些预构建的包不能再使用。因此,标准库的很大一部分必须重新编译。
虽然通过 go build -i 安装软件包可以缓解这个问题,但它也有其自身的缺点。安装使用 CGO_ENABLED=0 构建的软件包将提高未来构建的速度,但也会减慢不使用它的构建速度。
要解决此冲突,请考虑使用 -installsuffix 和/或 -pkgdir 标志,它为不同的编译模式创建单独的目录,优化构建效率并消除与 CGO_ENABLED 编译相关的延迟。
以上是为什么即使没有 C 绑定,启用 CGO_ENABLED 也会减慢编译速度?的详细内容。更多信息请关注PHP中文网其他相关文章!