gpt4 book ai didi

go - 为什么 CGO_ENABLED=0 的编译速度较慢?

转载 作者:IT王子 更新时间:2023-10-29 01:18:13 27 4
gpt4 key购买 nike

在编写利用网络的程序时,您会发现 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 的绑定(bind),所以 CGo 处理与否似乎无关紧要,我想做的是编译 100% 静态二进制文件,但如果速度变慢则不会。

这种行为的原因是什么?

最佳答案

问题是标准库包是在没有标志的情况下构建的。 CGO_ENABLED 更改构建标志,因此它不能使用预构建的包,因此大多数标准库需要重建。

正如提到的另一个答案,go build -i 将安装使用新标志构建的包,但这并不能真正解决很多问题,因为如果您安装使用 CGO_ENABLED= 构建的包0,它将加速所有 future 使用 CGO_ENABLED=0 的构建,但如果没有它,它将减慢所有构建。

不幸的是,今天默认安装预构建包的方式非常低效,因为无论它是如何构建的,所有东西都以相同的名称进入同一个目录。如果你希望能够使用不同的标志快速构建 go 程序,除了执行 go build -i 你还需要使用 -installsuffix 和/或-pkgdir 标志。在我工作的系统中,我们有几种不同的编译模式,每种模式都有不同的标志(因为我们使用了很多旧的 C 代码),每种模式也有自己的 -pkgdir .

关于go - 为什么 CGO_ENABLED=0 的编译速度较慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47714278/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com