在一台计算机上编译 Go 代码并在另一台计算机上运行它是否会降低程序的性能?

如果我在Mac上编译Go程序(显然,针对Linux架构)并将其推送到Linux服务器运行,是否会有任何性能损失?

我在某处读到Go编译器针对正在编译的特定硬件优化二进制文件,例如用于多线程的CPU内核数等?是真的吗?

在一台计算机上编译 Go 代码并在另一台计算机上运行它(不会降低性能)是否安全?


精慕HU
浏览 241回答 2
2回答

幕布斯6054654

在一台计算机上编译 Go 代码并在另一台计算机上运行它是否会降低程序的性能?不。您的问题表明,当面向同一平台时,不同的系统可以从同一来源构建不同的二进制文件,但它们没有。默认情况下,Go构建是可重现的,即针对同一平台(由GOOS和GOARCH指定),构建软件包时将始终产生完全相同的二进制文件,无论您在哪里构建它。这对于能够断言给定的二进制文件实际上是从给定的源生成的非常重要的。虽然有可能打破这种保证(例如,通过使用编译器参数等在二进制文件中故意包含时间戳),但这不会影响任何可测量数量的执行速度。-ldflags '-X main.timestamp=${DATE}'

繁华开满天机

在一台计算机上编译 Go 代码并在另一台计算机上运行它(不会降低性能)是否安全?是的。不会出现性能下降。<...> Go 编译器针对编译它的特定硬件优化二进制文件,例如用于多线程处理的 CPU 内核数等?是真的吗?不,它不是(截至2021-08-13),但请继续阅读一些注意事项。我们讨论中的“问题”是假定的默认值。问题是,“Go”是由其规范(及其内存模型)定义的编程语言,任何能够解析根据规范编写的文本文件并以遵循内存模型的方式执行其定义的Go程序的实现,根据定义,都是“可以运行Go程序”。如您所见,Go 可能有很多实现 — 包括用 Go 编写的 Go&nbsp;解释器(例如,搜索“八重”和“monkey-go”)。不过,我认为,可以安全地假设你指的是Go的“股票”,“默认”实现,它是由Go核心团队(和许多志愿者)开发的,可以从这里获得。该特定实现提供所谓的提前 (AOT) 编译,并且它包含的编译器目前不会导出任何生成时控件来影响机器代码生成。它也不考虑构建过程发生的本地系统的细节 - 例如其CPU模型和CPU上的H / W线程数。但请注意一个有趣的转折:自从一段时间以来,股票Go实现将wasm作为其目标架构之一,并且WASM代码(通常)在VM上运行,该VM可以实现实时(JIT)编译,该编译能够在运行时微调编译的代码(通过分析然后重新编译放置在热路径上的代码)。与AOT编译的机器代码相比,这种微调的确切价值是值得怀疑的,因为它取决于太多的东西,只能通过基准测试来比较和对比。断续器就您而言,请放心:交叉编译没有任何区别。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go