首页  >  文章  >  后端开发  >  为什么 Go 中使用 `CGO_ENABLED=0` 编译时间会变慢?

为什么 Go 中使用 `CGO_ENABLED=0` 编译时间会变慢?

DDD
DDD原创
2024-11-07 09:33:03661浏览

Why is Compilation Time Slower with `CGO_ENABLED=0` in Go?

CGO_ENABLED=0 时编译时间变慢

在开发与网络相关的 Go 程序时,可以观察到编译速度存在显着差异使用 CGO_ENABLED=0 和不使用 CGO_ENABLED=0 进行构建。即使在基本的 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

尽管没有任何直接的 C 绑定,但这种减慢仍然存在。根本原因在于构建过程。

构建标志的作用

CGO_ENABLED 是编译期间用于配置优化和包含 C 代码的众多构建标志之一。当此标志设置为 0 时,无法重用预构建的标准库包。因此,标准库的很大一部分必须重新编译,从而导致观察到的速度变慢。

替代方法

使用 go build -i 安装预构建的包时可以使用 CGO_ENABLED=0 加速未来的构建,但它不能解决没有 CGO_ENABLED 的构建的问题。为了有效地支持这两种构建配置,应通过 -installsuffix 和 -pkgdir 标志使用单独的安装目录。这种隔离确保使用不同标志构建的包不会相互覆盖。

以上是为什么 Go 中使用 `CGO_ENABLED=0` 编译时间会变慢?的详细内容。更多信息请关注PHP中文网其他相关文章!

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