2 回答
TA贡献1804条经验 获得超7个赞
有很多不同之处——布拉菲茨在 2014 年 5 月的一次谈话中谈到了其中的一些:
gccgo可以生成一个动态链接的二进制文件libgo,这使得输出更小,但意味着要在目标机器上安装相关库。cgo没有这个要求的二进制文件。gccgo进行更多的低级优化,因为它可以使用gcc的代码生成器和优化器。编写一些数据压缩代码,gccgo 的运行速度明显快于gc. 这些相同的优化使编译器变慢:它正在做更多的工作。gccgo支持目标处理器gcc,因此它是进入某些架构(如 SPARC、ARMv8(64 位)或 POWER)的唯一途径。(Canonical 使用它为 arm64 和 ppc64 编译他们的 Juju 服务编排工具。)gccgo并且gc两者都支持 ARMv7(32 位),但是根据 bradfitz 的说法gc并不能生成最高效的 ARM 代码。有某些优化只有
gc。一个重要的问题是转义分析,其中编译器确定某些变量永远不会“转义”分配它们的函数,因此可以进行堆栈分配。(因此,令人惊讶的是,
new(T)如果其返回值没有转义,则可能不会进行堆分配。)这减少了垃圾收集需要运行的频率。另一个是
.s标准库中的汇编程序文件仅通过 链接gc,因此gccgo默认情况下不使用诸如英特尔硬件 CRC32C 之类的东西(您必须专门为 gccgo 提供实现)。gc首先实现新的语言功能,并且通常比最新的gccgo.
TA贡献1851条经验 获得超3个赞
大小不同,因为 gc 生成静态二进制文件,而 gccgo 链接到 libgo。这意味着整个运行时(调度程序、垃圾收集器、映射、通道)的代码不在 gccgo 创建的最终二进制文件中。
编译速度当然有利于gc。GC 的构建考虑了编译速度。它还通常会生成较少优化的代码,并且需要执行的工作较少。
现在讨论为什么 gc 仍然更快。事实是,它们中的任何一个都不总是比另一个快。例如,尝试 md5 一个文件,GCCGO 会快一个数量级。尝试用很多通道来实现一些东西,gc 肯定会赢。你不能总是提前知道哪个会成功。GC 往往具有更高效的并发性,而 gccgo 往往更擅长数学。但是,这是您需要根据具体情况进行测试的。最好使用 go test 的基准测试系统而不是时间。
- 2 回答
- 0 关注
- 241 浏览
添加回答
举报
