誰かがGoogleのGoを使用したことがありますか?数学的なパフォーマンス(たとえば、フロップ)がガベージコレクターを備えた他の言語とどのように比較されるのか疑問に思っていました... Javaまたは.NET?
誰もこれを調査しましたか?
Go math package は、パフォーマンスのためにアセンブラーで主に記述されています。
ベンチマークは信頼できないことが多く、解釈の対象となります。たとえば、Robert Hundtの論文 C++/Java/Go/Scalaのループ認識 には欠陥があります。 Goプログラムのプロファイリング に関するGoブログ投稿では、Hundtの主張を分析しています。
理論上のパフォーマンス:純粋なGoプログラムの理論上のパフォーマンスは、C/C++とJavaの中間です。これは、高度な最適化コンパイラーを前提とし、プログラマーが言語のすべての機能(C、C++、JavaまたはGo))を利用し、プログラミング言語に適合するようにコードをリファクタリングすることも前提としています。
実用的なパフォーマンス(2011年7月現在):標準のGoコンパイラ(5g/6g/8g)は現在、高性能の数値コード用の効率的な命令ストリームを生成できないため、パフォーマンスはC/C++またはJavaよりも低くなります。これには複数の理由があります:各関数呼び出しには、C/C++またはJavaに比べていくつかの追加命令のオーバーヘッド、関数のインライン化なし、平均品質のレジスタ割り当て、平均品質のガベージコレクタ、バウンド消去能力の制限がありますチェック、Goからのベクトル命令へのアクセスなし、コンパイラーは32ビットx86 CPU上のSSE2をサポートしていません。
結論:目安として、5g/6g/8gでコンパイルされた純粋なGoで実装された数値コードのパフォーマンスは、C/C++またはJavaの2倍低いと予想されます。将来的にパフォーマンスが向上することを期待してください。
実用的なパフォーマンス(2013年9月):Go 1.1.2は、2011年7月の古いGoと比較して、より効率的な数値コードを生成できますが、C/C++やJavaよりも少し遅くなります。コンパイラーは、32ビットx86 CPUでもSSE2命令を使用します。これにより、32ビット数値コードの実行速度が大幅に向上します。これは、おそらくレジスター割り当ての改善によるものです。コンパイラは現在、関数のインライン化とエスケープ分析を実装しています。ガベージコレクタも改善されていますが、Javaのガベージコレクタよりも高度ではありません。 Goからのベクトル命令へのアクセスはまだサポートされていません。
要するに、競合する実装がベクトル命令を使用していない限り、パフォーマンスギャップはGoがC/C++およびJavaの数値コンピューティングの代替手段になるために十分に小さいようです。
実際にいくつかの異なる質問をしている。まず、Goの数学のパフォーマンスは、他の何と同じくらい高速になります。ネイティブコードにコンパイルされる言語(.NETなどのJIT言語も含まれます)は、生の数学で非常に優れたパフォーマンスを発揮します。単純な数学演算は、オーバーヘッドのない形式に非常に簡単にコンパイルできます。これは、コンパイルされた(JITを含む)言語が解釈された言語よりも有利な領域です。
もう1つの質問は、ガベージコレクションについてでした。重い数学について話している場合、これはある程度、副次的な問題です。 GCがパフォーマンスに影響を与えないということではありません。実際には、かなりの影響があります。ただし、タイトループの一般的な解決策は、avoidまたはminimizeGCスイープです。タイトなループを実行している場合、これは非常に簡単です。古い変数を常に割り当てたり破棄したりするのではなく、単に再使用するだけです。これにより、コードを数桁高速化できます。
GC実装自体に関しては、Goと.NETはどちらもマークアンドスイープガベージコレクションを使用します。マイクロソフトはGCエンジンに多くの焦点とエンジニアリングを注ぎ込んでおり、すべてのことを考慮して非常に良いことだと考えざるを得ません。 GoのGCエンジンは進行中の作業であり、.NETのアーキテクチャより遅く感じないが、Golangの人々は何らかの作業が必要だと主張している。 Goの仕様がデストラクタを許可しないという事実は、物事を高速化するのに大いに役立ちます。
最後に、私自身の逸話的な経験で、Goは非常に高速であることがわかりました。私は、パフォーマンスに誇りを持っている、長年にわたって尊敬されているオープンソースプロジェクトの高度に最適化されたCコードに対して、独自のベンチマークで立ち上がった非常にシンプルで簡単なプログラムを作成しました。
キャッチは、notallGoコードが効率的であることです。notallCコードが効率的であるように。正しくビルドする必要があります。これは、多くの場合、他の言語から慣れているものとは異なることを行うことを意味します。ここで数回言及されている プロファイリングのブログ投稿 は、その良い例です。
Googleは、Goを他の一般的な言語(C++、Java、Scala)と比較する研究を行いました。彼らは、それはパフォーマンスに関してそれほど強力ではないと結論付けました:
https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf
Goについての結論からの引用:
Goには興味深い言語機能があり、簡潔で標準化された表記も可能です。この言語のコンパイラはまだ未熟であり、パフォーマンスとバイナリサイズの両方を反映しています。