gpt4 book ai didi

go - 为什么用 gccgo 构建的二进制文件更小(除了其他差异?)

转载 作者:IT王子 更新时间:2023-10-29 01:22:51 28 4
gpt4 key购买 nike

我一直在试验 gc 和 gccgo,我遇到了一些奇怪的行为。

使用 program我曾经写信来测试一些定理,我得到了这些结果:(为了可读性,我删除了不必要的信息)

$ time go build -compiler gc -o checkprog_gc checkprog.go (x 3)
go build <...> 0.13s user 0.02s system 100% cpu 0.149 total
go build <...> 0.13s user 0.01s system 99% cpu 0.148 total
go build <...> 0.14s user 0.03s system 100% cpu 0.162 total
--> average: 0.13s user 0.02s system 100% cpu 0.153 total


$ time go build -compiler gccgo -o checkprog_gccgo checkprog.go (x 3)
go build <...> 0.10s user 0.03s system 96% cpu 0.135 total
go build <...> 0.12s user 0.01s system 96% cpu 0.131 total
go build <...> 0.10s user 0.01s system 92% cpu 0.123 total
--> average: 0.11s user 0.02s system 95% cpu 0.130 total


$ strip -s -o checkprog_gc_stripped checkprog_gc
$ strip -s -o checkprog_gccgo_stripped checkprog_gccgo

$ ls -l
1834504 checkprog_gc*
1336992 checkprog_gc_stripped*
35072 checkprog_gccgo*
24192 checkprog_gccgo_stripped*

$ time ./checkprog_gc
./checkprog_gc 6.68s user 0.01s system 100% cpu 6.674 total
./checkprog_gc 6.75s user 0.01s system 100% cpu 6.741 total
./checkprog_gc 6.66s user 0.00s system 100% cpu 6.643 total
--> average: 6.70s user 0.01s system 100% cpu 6.686 total

$ time ./checkprog_gccgo
./checkprog_gccgo 10.95s user 0.02s system 100% cpu 10.949 total
./checkprog_gccgo 10.98s user 0.01s system 100% cpu 10.964 total
./checkprog_gccgo 10.94s user 0.01s system 100% cpu 10.929 total
--> average 10.96s user 0.01s system 100% cpu 10.947 total

我可以看到以下模式:

  1. 使用 gccgo 构建的二进制文件的大小要小得多(剥离无助于改变这种差异)
  2. 使用 gc 构建的二进制文件执行速度更快
  3. 使用 gccgo 构建比使用 gc
  4. 花费更多的时间

我还测试了一些其他的 go 程序(虽然没有那么广泛),它们都表现出相同的行为。

这似乎与this answer相矛盾状态:

In short: gccgo: more optimization, more processors.

我认为更多的优化意味着更快的二进制文件,同时需要更多的时间来编译...

出现这三种模式的原因是什么?

最佳答案

有很多差异-- bradfitz talked about some of them in a May 2014 talk :

  • gccgo 可以生成动态链接到libgo 中的二进制文件,这使得输出更小,但意味着要在目标机器上安装相关库。没有 cgo 的 Go 二进制文件没有这个要求。
  • gccgo 进行了更多低级优化,因为它可以使用 gcc 的代码生成器和优化器。编写一些数据压缩代码,gccgo 运行速度明显快于 gc。这些相同的优化使编译器变慢:它做更多的工作。
  • gccgo 支持 gcc 支持的目标处理器,因此它是进入某些架构(如 SPARC、ARMv8(64 位)或 POWER)的唯一途径。 (Canonical 使用它为 arm64 和 ppc64 编译他们的 Juju 服务编排工具。)
  • gccgogc 都支持 ARMv7(32 位),但根据 bradfitz 的谈话,gc 不会生成最高效的 ARM 代码.
  • 只有 gc 有某些优化。
    • 一个大的是escape analysis ,其中编译器确定某些变量永远不会“逃逸”分配它们的函数,因此可以进行堆栈分配。 (所以,令人惊讶的是,如果 new(T) 的返回值没有转义,它可能不会进行堆分配。)这减少了垃圾收集需要运行的频率。
    • 另一个是标准库中的.s 汇编文件仅通过gc 链接进来,所以 不使用Intel 硬件CRC32C 之类的东西gccgo 默认情况下(您必须提供专门针对 gccgo 的实现)。
  • gc 首先实现新的语言特性,并且通常是比最新的 gccgo 早一两个的次要 Go 版本。

关于go - 为什么用 gccgo 构建的二进制文件更小(除了其他差异?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27067112/

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