首页 > 后端开发 > Golang > 为什么即使没有 C 绑定,启用 CGO_ENABLED 也会减慢编译速度?

为什么即使没有 C 绑定,启用 CGO_ENABLED 也会减慢编译速度?

Patricia Arquette
发布: 2024-11-26 03:29:08
原创
128 人浏览过

Why Does Enabling CGO_ENABLED Slow Down Compilation, Even Without C Bindings?

即使没有 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板