数组访问显然在边界内(可以删除边界检查),尽管如此,我发现相对于 amd64 上的
gcc -o3
速度有 4 倍的差异。这是为什么?,(使用shell计时。每次需要几秒钟,因此启动可以忽略不计),c 版本:,更新:,按照建议使用 range
,可以将 go 速度提高 2 倍。另一方面,在我的测试中,
-march=native
将 c 速度提高了 2 倍。 (并且-mno-sse
给出编译错误,显然与-o3
不兼容)gccgo 在这里看起来与 gcc 相当(并且不需要
range
),看看 C 程序与 Go 程序的汇编程序输出,至少在我使用的 Go 和 GCC 版本(分别为 1.19.6 和 12.2.0)上,最直接和明显的区别是 GCC自动向量化 C 程序,而 Go 编译器似乎无法做到这一点。,这也很好地解释了为什么您会看到性能提高了四倍,因为 GCC 在不针对特定架构时使用 SSE 而不是 AVX,这意味着 32 位标量指令宽度是四倍运营。事实上,添加 -march=native
为我带来了两倍的性能提升,因为这使得 GCC 在我的 CPU 上输出 AVX 代码。,我对 Go 还不够熟悉,无法告诉你 Go 编译器是否本质上无法进行自动向量化,或者是否只是这个特定的程序由于某种原因导致它出错,但这似乎是根本原因.,