首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么用CGO_ENABLED=0编译会慢一些?

CGO_ENABLED是一个环境变量,用于控制Go编译器是否启用CGO(C语言调用Go函数)功能。当CGO_ENABLED=0时,表示禁用CGO功能。

编译时使用CGO_ENABLED=0会导致编译速度较慢的原因有以下几点:

  1. 编译器需要额外的时间来检查和处理CGO相关的代码。虽然禁用了CGO功能,但编译器仍然需要扫描代码中的CGO相关指令,并进行相应的处理,这会增加编译时间。
  2. CGO_ENABLED=0会导致编译器无法使用C语言的优化技术。CGO允许Go代码调用C语言函数,这样可以利用C语言的优化技术来提高性能。禁用CGO后,编译器无法使用这些优化技术,可能会导致编译出的代码性能较低。
  3. 编译器需要处理更多的Go代码。在启用CGO时,编译器只需要处理与CGO相关的代码部分,而禁用CGO后,编译器需要处理全部的Go代码,这会增加编译时间。

总结起来,使用CGO_ENABLED=0编译会慢一些是因为编译器需要额外的时间来处理CGO相关的代码,并且无法使用C语言的优化技术,同时还需要处理更多的Go代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Go学习笔记:golang交叉编译

$ cd /usr/local/go/src $ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash 如果是 Windows 则修改 GOOS 即可。...$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash (2) 现在可以编译 Linux 和 Windows 平台所需的执行文件了。...$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build $ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build 不过该方式暂时不支持...http://solovyov.net/en/2012/03/09/cross-compiling-go/ 以上假定是64位架构,32位,修改GOARCH386 说明: 这里并不是重新编译Go,因为安装...之所以需要执行上面的这些步骤,是因为安装Go语言时,一些工具和平台相关的代码并没有生成,执行上面的步骤,并不是重新安装Go语言,而是生成交叉编译(目标平台)需要的工具和文件。

1.7K40
  • 创建最小的Go docker 镜像

    编译Go程序 上面的例子中我们使用下面的命令编译Go程序: 1GOOS=linux CGO_ENABLED=0 go build -ldflags="-s -w" -o app app.go 你可能在其它一些文章中还看到...你也可以使用strip工具对编译的Go程序进行裁剪。 本身Go是静态编译的, 对于CGO, 如果设置CGO_ENABLED=0,则完全静态编译,不会再依赖动态库。...如果设置CGO_ENABLED=0,并且你的代码中使用了标准库的net包的话,有可能编译好的镜像无法运行,报sh: /app: not found的错误,尽管/app这个文件实际存在,并且如果讲基础镜像换为...下面是几种解决办法: 设置 CGO_ENABLED=0 编译是使用纯go的net: go build -tags netgo -a -v 使用基础镜像加glibc(或等价库musl、uclibc), 比如...你应该只在编译阶段使用Go的镜像,这样才能将你的镜像减小到最小。 ---- 版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们立即删除并表示歉意。

    1.4K40

    Go 应用容器化

    使用多阶段构建编译可以使用 golang 的官方镜像进行编译,建议使用静态编译,因为 golang 官方镜像默认使用的基础镜像是 debian,如果使用默认的编译依赖依赖一些动态链接库,当业务镜像使用了其它发行版基础镜像.../buildWORKDIR /buildRUN CGO_ENABLED=0 go build -trimpath -ldflags='-s -w -extldflags=-static' -o /appFROM.../buildWORKDIR /buildRUN CGO_ENABLED=0 go build -trimpath -ldflags='-s -w -extldflags=-static' -o /appFROM...利用 go module 缓存加速构建如果在固定的机器上编译镜像,可以考虑在 Dockerfile 中 go modules 缓存单独使用一个阶段构建,具体思路是将项目中的 go.mod 和 go.sum...=0 go build -o app -ldflags '-w -extldflags "-static"' .FROM alpine:latestRUN apk add --no-cache tzdata

    12910

    由一条编译报错信息,引出两个Go编译的重要知识

    具体怎么用呢,比如这个例子里是需要在Mac环境下编译能在Linux系统amd64架构下运行的执行文件,就得酱婶进行编译CGO_ENABLED=0 GOOS=linux GOARCH=amd64...Go 的命令集是原生支持交叉编译的,使用方法也很简单,比如上面已经演示过的 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go 参数说明...Mac 下编译, Linux 或者 Windows 的可执行程序 # linux可执行程序 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go...# Windows 可执行程序 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go Linux 下编译 , Mac 或者 Windows...下去执行 # Mac 平台可执行程序 CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go # Windows可执行程序 CGO_ENABLED

    98950

    透过一个编译报错,总结两个Go程序编译的重要知识

    具体怎么用呢,比如这个例子里是需要在Mac环境下编译能在Linux系统amd64架构下运行的执行文件,就得酱婶进行编译CGO_ENABLED=0 GOOS=linux GOARCH=amd64...Go 的命令集是原生支持交叉编译的,使用方法也很简单,比如上面已经演示过的 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go 参数说明...Mac 下编译, Linux 或者 Windows 的可执行程序 # linux可执行程序 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go...# Windows 可执行程序 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go Linux 下编译 , Mac 或者 Windows...下去执行 # Mac 平台可执行程序 CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go # Windows可执行程序 CGO_ENABLED

    2.7K10

    企业FRP安全实践

    我们尝试与相关部门沟通,有进展的话予以答复。” 看到的第一反应是无论此事真假,但如果发生在我司,安全部有没有能力去发现?...二、两种常见示例 2.1 SSH 访问内网机器 1、图示 图示最能一眼直观看懂,奈何翻遍互联网没有找到让我满意的示意图,清晰表达,故简单画图。 ?.../cmd/frpsenv CGO_ENABLED=0 go build -ldflags "-s -w" -o bin/frpc ....五、思考 做一些发散思考和思路,时间原因,并未全部尝试;攻防本是对抗过程,文中方法可能随时失效,授人鱼不如授人以渔。...) 零信任解决方案,基于账号、角色、权限、访问对象,结合微隔离、SDP,极端一些可以达到MAC(强制访问控制)模型 六、引用和致谢 感谢引用中各位大佬和团队的分享精神!

    1.6K20

    Docker 镜像多阶段构建

    、测试、打包等流程,这里可能带来的一些问题: Dockerfile 特别长,可维护性降低 镜像层次多,镜像体积较大,部署时间变长 源代码存在泄露的风险 例如 编写 app.go 文件,该程序输出...RUN go get -d -v github.com/go-sql-driver/mysql \ && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix...分散到多个 Dockerfile 另一种方式,就是我们事先在一个 Dockerfile 将项目及其依赖库编译测试打包好后,再将其拷贝到运行环境中,这种方式需要我们编写两个 Dockerfile 和一些编译脚本才能将其两个阶段自动整合起来...RUN go get -d -v github.com/go-sql-driver/mysql \ && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix...RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

    1.6K40

    Docker学习——多阶段构建(六) 顶

    、 测试、打包等流程,这里可能带来的一些问题: 1、Dockerfile 特别长,可维护性降低 2、镜像层次多,镜像体积较大,部署时间变长 3、源代码存在泄露的风险 例如 编写 app.go 文件,该程序输出...RUN go get -d -v github.com/go-sql-driver/mysql \ && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix...分散到多个 Dockerfile 另一种方式,就是我们事先在一个 Dockerfile 将项目及其依赖库编译测试打包好后,再将其拷贝到运行环境中,这种方式需要我们编写两个 Dockerfile 和一些编译脚本才能将其两个阶段自动整合起来...RUN go get -d -v github.com/go-sql-driver/mysql \ && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix...RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

    60110

    如何优雅的通过Shell脚本一键部署GO项目到服务器 |Go主题月

    grep -E "RunningManageServer"|grep -v grep|awk '{print $2}'` echo -e "${GREEN_COLOR}****部署成功,部署的进程ID:...手动分步操作 下面再说一下如果不使用脚本的话,如何一步一步手动操作,部署项目到服务器 部署项目 开发环境重新build项目(Mac环境的打包语法) CGO_ENABLED=0 GOOS=linux GOARCH.../singo > nohup.log 2>&1 & 跨平台编译:windows set CGO_ENABLED=0 //禁用CGO set GOOS=linux //目标平台linux set GOARCH...=amd64 //目标处理器架构是amd64 go build -o name //编译可执行文件到当前目录 (-o:自定义文件名) 跨平台编译:Mac CGO_ENABLED=0 GOOS=linux...GOARCH=amd64 go build 其他问题 go项目运行之后,修改.env文件不会立即生效,需要重启go服务才会生效 go项目运行之后,修改config.ini配置文件立即生效,无需重启

    79931

    简述Go以及搭建Go环境

    在hello目录下执行:  go build  或者在其他目录执行以下命令:  go build hello  go编译器会去 GOPATH的src目录下查找你要编译的hello项目 编译得到的可执行文件保存在执行编译命令的当前目录下...只需要指定目标操作系统的平台和处理器架构即可: SET CGO_ENABLED=0 // 禁用CGO SET GOOS=linux // 目标平台是linux SET GOARCH=amd64 /...Mac 下编译 Linux 和 Windows平台 64位 可执行程序: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build CGO_ENABLED=0 GOOS...=windows GOARCH=amd64 go build Linux 下编译 Mac 和 Windows 平台64位可执行程序: CGO_ENABLED=0 GOOS=darwin GOARCH=amd64...go build CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build Windows下编译Mac平台64位可执行程序: SET CGO_ENABLED=0

    1.1K20

    【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践

    /myapp当然,一般来说依赖安装稍微复杂一些,有些涉及的是ARm和非ARM的版本问题,有的是版本号的升级和降级,除了上文额if和else之外,还可以使用sed –i命令进行个性化修改,比如安装脚本是这样的...下面是一些CGO多系统多架构编译的方法:2.1 使用CGO_ENABLED环境变量使用CGO_ENABLED环境变量。CGO_ENABLED环境变量可以用来控制CGO是否启用。...在进行多系统多架构编译时,我们可以设置CGO_ENABLED环境变量0,这样就可以禁用CGO,从而避免在不同的操作系统和架构中出现问题。...下面是一些#cgo指令符在cgo多架构编译中的使用方法:#cgo CFLAGS#cgo CFLAGS指令符可以用来指定C语言编译器的编译选项。..._WINNT=0x0601编译选项来编译C语言代码#cgo linux#cgo windows指令符可以用来指定Linux操作系统下的编译选项。

    6.4K51

    【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践

    /myapp 复制 当然,一般来说依赖安装稍微复杂一些,有些涉及的是ARm和非ARM的版本问题,有的是版本号的升级和降级,除了上文额if和else之外,还可以使用sed –i命令进行个性化修改,比如安装脚本是这样的...下面是一些CGO多系统多架构编译的方法: 2.1 使用CGO_ENABLED环境变量 使用CGO_ENABLED环境变量。CGO_ENABLED环境变量可以用来控制CGO是否启用。...在进行多系统多架构编译时,我们可以设置CGO_ENABLED环境变量0,这样就可以禁用CGO,从而避免在不同的操作系统和架构中出现问题。...下面是一些#cgo指令符在cgo多架构编译中的使用方法: #cgo CFLAGS #cgo CFLAGS指令符可以用来指定C语言编译器的编译选项。...-D_WIN32_WINNT=0x0601编译选项来编译C语言代码 #cgo linux #cgo windows指令符可以用来指定Linux操作系统下的编译选项。

    1.4K60

    通过多阶段构建减小Golang镜像的大小

    我会说不,因为生成的镜像大小超过300MB(确切地说是322MB),因为它包含了所有的Golang工具,这对我们来说是不必要的,因为我们指示编译器禁用cgo(CGO_ENABLED=0)并静态链接任何将为我们提供自包含可执行文件的...CGO_ENABLED=0 是至关重要的,如果我们不构建自包含的可执行文件,多阶段构建过程将无法工作。 我们可以做得更好的是,采用所谓的多阶段构建。...RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ENV HTTP_PORT=8080 EXPOSE 8080 # BINARIES FROM alpine...RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build ENV HTTP_PORT=8080 EXPOSE 8080 # MINIATURE FROM scratch...如果你排除一些特殊情况——那些在alpine:latest和scratch构建的最终镜像之间的5.36MB差异可能产生巨大的影响——在其余的情况下,你最终会在生产中得到一个完全没有任何工具的容器,我完全不推荐这样做

    10610

    如何优雅的把Go项目部署到Linux服务器?

    注意问题 go项目运行之后,修改.env文件不会立即生效,需要重启go服务才会生效 go项目运行之后,修改config.ini配置文件立即生效,无需重启go服务 重新部署项目 开发环境重新build项目...(Mac环境的打包语法) CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build 查找指定端口的进程 博主的端口号9001 netstat -tunlp|grep...singo > nohup.log 2>&1 & 4543是要结束的进程pid singo是二进制文件名 使用&&同时执行2条命令,避免服务中断 附录Windows平台的打包语法 windows set CGO_ENABLED...=0 //禁用CGO set GOOS=linux //目标平台linux set GOARCH=amd64 //目标处理器架构是amd64 go build -o name //编译可执行文件到当前目录...(-o:自定义文件名) Mac CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

    2.6K20
    领券