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

私は興味があり、「最適化」コンパイラがより遅いコードを生成する理由を知りたいと思っています。

gprof生成されたgccgoバイナリで使用しようとしました:

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

編集:

ああ、私は言及するのを完全に忘れていました...私は明らかに-で生成されたバイナリでpprofを試しましたgccgo...ここに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

そしてそれが私が何か他のものを探している理由です。

EDIT2:

誰かが私の質問を閉じたいと思っているようですので、私は突然使用しようとしませんでしgprofた: https://groups.google.com/d/msg/golang-nuts/1xESoT5Xcd0/bpMvxQeJguMJ

4

2 に答える 2

2

gccgo で生成されたバイナリを Valgrind で実行すると、gccgoメモリ アロケータが非効率的であることを示しているようです。gccgoこれが、 4.7.2 がgo1.0.2より遅い理由の 1 つかもしれません。go 1.0.2 によって生成されたバイナリを Valgrind で実行することは不可能であるため、この場合、メモリ割り当てが gccgo の主なパフォーマンスの問題であるかどうかを確認することは困難です。

于 2013-02-25T22:54:02.653 に答える
0

また、デフォルトで静的リンクを使用することを忘れないでください。go buildしたがって、リンゴとリンゴを比較するには、gccgo に-staticor-static-libgoオプションを指定する必要があります。

于 2014-06-13T18:00:42.697 に答える