首页  >  文章  >  后端开发  >  为什么即使没有 C 绑定,使用“CGO_ENABLED=0”Go 编译也会变慢?

为什么即使没有 C 绑定,使用“CGO_ENABLED=0”Go 编译也会变慢?

Linda Hamilton
Linda Hamilton原创
2024-11-07 00:25:02797浏览

Why is Go compilation slower with `CGO_ENABLED=0` even without C bindings?

CGO_ENABLED=0 时编译时间减慢

开发基于网络的 Go 程序时,使用 CGO_ENABLED=0 进行编译可能会导致显着减慢与 CGO_ENABLED=1 相比。即使没有使用 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)
    }
}

当 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

速度变慢的原因

编译时间的差异源于对标准库包。当 CGO_ENABLED=1 时,这些包是使用必要的标志构建的,但当 CGO_ENABLED=0 时,它们不是。

没有标志的标准库包不能与 CGO_ENABLED=0 一起使用,迫使大多数库被重建。这会显着增加编译时间。

缓解速度

一种解决方案是使用 go build -i 安装具有所需标志的预构建包。然而,这种方法也带来了其自身的挑战。安装没有 CGO_ENABLED=0 构建的软件包可以加快未来没有 CGO_ENABLED=0 的构建速度,但会减慢 CGO_ENABLED=0 的构建速度。

要解决此问题,建议使用 -installsuffix 和/或 -pkgdir 标志,它允许根据使用的编译标志使用不同的包安装目录。这可以使用不同的标志进行高效构建。

以上是为什么即使没有 C 绑定,使用“CGO_ENABLED=0”Go 编译也会变慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn