6

我相信知道的每个人都知道golang这里的博客文章

再读一遍,我想知道使用gccgo代替是否go build会提高速度。在我的典型用例(科学计算)中,生成的gccgo二进制文件总是比生成的二进制文件快go build

所以,只需抓住这个文件:havlak6.go并编译它:

go build havlak6.go -O havlak6_go
gccgo -o havlak6_gccgo -march=native -Ofast havlak6.go

惊喜 !

$/usr/bin/time ./havlak6_go
5.45user 0.06system 0:05.54elapsed 99%CPU

$/usr/bin/time ./havlak6_gccgo
11.38user 0.16system 0:11.74elapsed 98%CPU

我很好奇,想知道为什么“优化”编译器会产生较慢的代码。

我尝试gprofgccgo生成的二进制文件上使用:

gccgo -pg -march=native -Ofast havlak6.go
./a.out
gprof a.out gmon.out

没有运气:

Flat profile:

Each sample counts as 0.01 seconds.
 no time accumulated

正如你所看到的,代码实际上并没有被分析。

当然,我读过这个,但正如你所见,程序需要 10+ 秒才能执行......样本数应该 > 1000。

我也试过:

rm a.out gmon.out
LDFLAGS='-g -pg' gccgo -g -pg -march=native -Ofast havlak6.go
./a.out
gprof

也没有成功。

你知道出了什么问题吗?你知道为什么gccgo,它的所有优化例程都没有比gc这种情况更快吗?

go版本:1.0.2 gcc版本:4.7.2

编辑:

哦,我完全忘了提......我显然在gccgo-generated 二进制文件上尝试了 pprof ......这是一个top10

Welcome to pprof!  For help, type 'help'.
(pprof) top10
Total: 1143 samples
    1143 100.0% 100.0%     1143 100.0% 0x00007fbfb04cf1f4
       0   0.0% 100.0%      890  77.9% 0x00007fbfaf81101e
       0   0.0% 100.0%        4   0.3% 0x00007fbfaf8deb64
       0   0.0% 100.0%        1   0.1% 0x00007fbfaf8f2faf
       0   0.0% 100.0%        3   0.3% 0x00007fbfaf8f2fc5
       0   0.0% 100.0%        1   0.1% 0x00007fbfaf8f2fc9
       0   0.0% 100.0%        1   0.1% 0x00007fbfaf8f2fd6
       0   0.0% 100.0%        1   0.1% 0x00007fbfaf8f2fdf
       0   0.0% 100.0%        2   0.2% 0x00007fbfaf8f4a2f
       0   0.0% 100.0%        1   0.1% 0x00007fbfaf8f4a33

这就是为什么我在寻找别的东西。

编辑2:

由于似乎有人希望我的问题被关闭,我没有尝试突然使用gprofhttps ://groups.google.com/d/msg/golang-nuts/1xESoT5Xcd0/bpMvxQeJguMJ

4

2 回答 2

2

在 Valgrind 下运行 gccgo 生成的二进制文件似乎表明它gccgo的内存分配器效率低下。gccgo这可能是4.7.2 比go1.0.2慢的原因之一。在 Valgrind 下运行 go 1.0.2 生成的二进制文件是不可能的,因此在这种情况下,很难确定内存分配是否是 gccgo 的主要性能问题。

于 2013-02-25T22:54:02.653 回答
0

还请记住go build,默认为静态链接,因此对于苹果与苹果的比较,您应该为 gccgo 提供-staticor-static-libgo选项。

于 2014-06-13T18:00:42.697 回答