在一台机器上编译 Go 代码并 运行 在另一台机器上编译会降低程序的性能吗?
Does compiling Go code on one machine and running it on another degrade the program's performance?
如果我在我的 Mac 上编译一个 Go 程序(显然,针对 Linux 架构)并将其推送到 Linux 服务器到 [=21=,会有任何性能损失吗? ]上?
我在某处读到 Go 编译器会针对正在编译的特定硬件优化二进制文件,例如用于多线程的 CPU 核心数量等?是真的吗?
在一台机器上编译 Go 代码然后 运行 在另一台机器上编译它安全吗(不会降低性能)?
Does compiling Go code on one machine and running it on another degrade the program's performance?
没有
您的问题表明,不同的系统可以在针对同一平台时从同一来源构建不同的二进制文件,但事实并非如此。默认情况下,Go 构建是可重现的,即在构建包时针对相同的平台(由 GOOS and GOARCH 指定)将始终产生完全相同的二进制文件,无论您在哪里构建它。这对于能够断言给定二进制文件实际上是从给定源生成的非常重要。
虽然有可能打破这种保证(例如通过使用 -ldflags '-X main.timestamp=${DATE}'
等编译器参数故意在二进制文件中包含时间戳),但这不会影响您的执行速度数量.
Is it safe to compile Go code on one machine and run it on another (without performance degradation)?
是的。不会有性能下降。
<…> Go compiler optimizes the binary for the specific hardware its being compiled on, like the number of CPU cores for multithreading, etc.? Is it true?
不,不是(截至 2021 年 8 月 13 日),但请继续阅读以了解一些注意事项。
我们讨论中的“问题”是假定的默认值。
事实是,“Go”是一种由 spec (and its memory model) 定义的编程语言,任何 实现都能够解析根据规范并执行他们以符合内存模型的方式定义的 Go 程序,根据定义,“可以 运行 Go 程序”。
如您所见,可能有很多 Go 的实现 — 包括用 Go 编写的 Go interpreters(例如,搜索“yaegi”和“monkey-go” ).
不过,我认为,可以安全地假设您 意思是 Go 的“标准”、“默认”实现,它是由 Go 核心团队开发的(以及许多志愿者),可从 here.
获得
该特定实现提供了所谓的 ahead-of-time (AOT) compilation,并且它包含的编译器目前不会导出任何构建时控制来影响机器代码生成。
它也不考虑构建过程发生的本地系统的细节——例如它的 CPU 模型和它的 CPU 上的 H/W 线程数。
但请注意一个有趣的转折:since some time the stock Go implementation has wasm
as one of the architectures it targets, and WASM code (typically) runs on a VM which may implement just-in-time (JIT) compilation 能够在 运行 时间微调编译代码(通过分析然后重新编译代码铺设在热门路径上)。
与 AOT 编译的机器代码相比,这种微调的确切价值值得怀疑,因为它取决于太多东西,只能通过基准测试进行比较和对比。
TL;DR
在你的情况下,请相信:交叉编译没有任何区别。
如果我在我的 Mac 上编译一个 Go 程序(显然,针对 Linux 架构)并将其推送到 Linux 服务器到 [=21=,会有任何性能损失吗? ]上?
我在某处读到 Go 编译器会针对正在编译的特定硬件优化二进制文件,例如用于多线程的 CPU 核心数量等?是真的吗?
在一台机器上编译 Go 代码然后 运行 在另一台机器上编译它安全吗(不会降低性能)?
Does compiling Go code on one machine and running it on another degrade the program's performance?
没有
您的问题表明,不同的系统可以在针对同一平台时从同一来源构建不同的二进制文件,但事实并非如此。默认情况下,Go 构建是可重现的,即在构建包时针对相同的平台(由 GOOS and GOARCH 指定)将始终产生完全相同的二进制文件,无论您在哪里构建它。这对于能够断言给定二进制文件实际上是从给定源生成的非常重要。
虽然有可能打破这种保证(例如通过使用 -ldflags '-X main.timestamp=${DATE}'
等编译器参数故意在二进制文件中包含时间戳),但这不会影响您的执行速度数量.
Is it safe to compile Go code on one machine and run it on another (without performance degradation)?
是的。不会有性能下降。
<…> Go compiler optimizes the binary for the specific hardware its being compiled on, like the number of CPU cores for multithreading, etc.? Is it true?
不,不是(截至 2021 年 8 月 13 日),但请继续阅读以了解一些注意事项。
我们讨论中的“问题”是假定的默认值。
事实是,“Go”是一种由 spec (and its memory model) 定义的编程语言,任何 实现都能够解析根据规范并执行他们以符合内存模型的方式定义的 Go 程序,根据定义,“可以 运行 Go 程序”。
如您所见,可能有很多 Go 的实现 — 包括用 Go 编写的 Go interpreters(例如,搜索“yaegi”和“monkey-go” ).
不过,我认为,可以安全地假设您 意思是 Go 的“标准”、“默认”实现,它是由 Go 核心团队开发的(以及许多志愿者),可从 here.
获得
该特定实现提供了所谓的 ahead-of-time (AOT) compilation,并且它包含的编译器目前不会导出任何构建时控制来影响机器代码生成。
它也不考虑构建过程发生的本地系统的细节——例如它的 CPU 模型和它的 CPU 上的 H/W 线程数。
但请注意一个有趣的转折:since some time the stock Go implementation has wasm
as one of the architectures it targets, and WASM code (typically) runs on a VM which may implement just-in-time (JIT) compilation 能够在 运行 时间微调编译代码(通过分析然后重新编译代码铺设在热门路径上)。
与 AOT 编译的机器代码相比,这种微调的确切价值值得怀疑,因为它取决于太多东西,只能通过基准测试进行比较和对比。
TL;DR
在你的情况下,请相信:交叉编译没有任何区别。