5

私は gc と gccgo を試していて、奇妙な動作に遭遇しました。

ある定理をテストするためにかつて書いたプログラムを使用して、次の結果を得ました: (読みやすくするために不要な情報を削除しました)

$ time go build -compiler gc -o checkprog_gc checkprog.go (x 3)
go build <...>    0.13s user 0.02s system 100% cpu 0.149 total
go build <...>    0.13s user 0.01s system 99%  cpu 0.148 total
go build <...>    0.14s user 0.03s system 100% cpu 0.162 total
 --> average:     0.13s user 0.02s system 100% cpu 0.153 total


$ time go build -compiler gccgo -o checkprog_gccgo checkprog.go (x 3)
go build <...>    0.10s user 0.03s system 96% cpu 0.135 total
go build <...>    0.12s user 0.01s system 96% cpu 0.131 total
go build <...>    0.10s user 0.01s system 92% cpu 0.123 total
 --> average:     0.11s user 0.02s system 95% cpu 0.130 total


$ strip -s -o checkprog_gc_stripped checkprog_gc
$ strip -s -o checkprog_gccgo_stripped checkprog_gccgo

$ ls -l
 1834504 checkprog_gc*
 1336992 checkprog_gc_stripped*
   35072 checkprog_gccgo*
   24192 checkprog_gccgo_stripped*

$ time ./checkprog_gc
./checkprog_gc  6.68s user 0.01s system 100% cpu 6.674 total
./checkprog_gc  6.75s user 0.01s system 100% cpu 6.741 total
./checkprog_gc  6.66s user 0.00s system 100% cpu 6.643 total
 --> average:   6.70s user 0.01s system 100% cpu 6.686 total

$ time ./checkprog_gccgo
./checkprog_gccgo  10.95s user 0.02s system 100% cpu 10.949 total
./checkprog_gccgo  10.98s user 0.01s system 100% cpu 10.964 total
./checkprog_gccgo  10.94s user 0.01s system 100% cpu 10.929 total
 --> average       10.96s user 0.01s system 100% cpu 10.947 total

次のパターンが見られます。

  1. で構築されたバイナリgccgoは、サイズが大幅に小さくなります (そして、ストリッピングはこの違いを変えるのに役立ちません)
  2. でビルドされたバイナリgcは実行が高速です
  3. gccgoで構築するよりも構築するのに少し時間がかかりますgc

他の go プログラムもいくつかテストしましたが (それほど広範囲ではありませんが)、それらはすべて同じ動作を示しました。

これは、この回答が述べていることと矛盾しているようです:

要するに: gccgo: より多くの最適化、より多くのプロセッサ。

コンパイルにより多くの時間を必要としながら、より多くの最適化はより高速なバイナリを意味すると思います...

この3パターンの理由は?

4

2 に答える 2

7

サイズが異なるのは、gc が静的バイナリを作成し、gccgo が libgo にリンクするためです。これは、ランタイム全体 (スケジューラ、ガベージ コレクタ、マップ、チャネル) のコードが、gccgo によって作成された最終的なバイナリに含まれていないことを意味します。

もちろん、コンパイルの速度はgcに有利です。GC は、コンパイルの速度を念頭に置いて構築されました。また、通常、最適化されていないコードが作成され、実行する必要のある作業が少なくなります。

gc が依然として高速である理由について説明します。真実は、どちらも常に他方より速いということではありません。たとえば、ファイルを md5 しようとすると、GCCGO が桁違いに高速になります。たくさんのチャンネルを使って何かを実装しようとすると、gc が確実に勝つでしょう。どちらが成功するかを常に前もって知ることはできません。GC はより効率的な同時実行性を持つ傾向があり、gccgo は数学に優れている傾向があります。ただし、これはケースバイケースでテストする必要があるものです。時間ではなく、go test のベンチマーク システムを使用することをお勧めします。

于 2014-11-21T18:13:02.373 に答える