Goはどれくらいの速度で移動できますか?


39

Goは、「金属に近い」状態で実行されるはずの数少ない言語の1つです。つまり、コンパイルされ、静的に型指定され、VMなしでネイティブにコードを実行します。これにより、Java、C#などよりも速度が向上します。ただし、Javaの背後にあるようです(プログラミング言語のShootoutを参照)

成熟度の低いコンパイラがこれに大きな責任を負っていると仮定していますが、他の理由はありますか?Goの設計に固有のものはありますか。たとえば、Javaよりも速く動作することを妨げるものはありますか。私はランタイムモデルについて非常に洗練された見方をしていますが、少なくとも原則として、ネイティブコードの実行のおかげで、Javaよりも速く実行できるはずです。


3
十分にスマートなコンパイラー(および/またはVM、および/またはJITコンパイラー)があれば、特定の言語は常に高速化できます(物理的な制限がありますが、それだけです)。もちろん、この十分にスマートなコンパイラーがなければ、この真理は誰にも役に立たない。ただし、Javaにはすでにこれらの十分にスマートな実装があり、信じられないほどスマートです。人生のもう1つの事実は、コードの実行が実装と少なくとも同じくらいランタイムのパフォーマンスに影響を与えることです。

1
私はそれを理解していますが、Goの速度がコンパイラの成熟に伴い、たとえばJavaに匹敵/追い越すことを期待するのが妥当かどうか疑問に思っていました。
グレッグスロドコヴィッツ

17
プログラミング言語には速度がありません。言語実装も同様です。特定の言語実装には、特定の入力に対して速度があり、この速度は入力に非常に大きく依存します。

8
目を覚ます..行く前に... ワム!。すみません、抵抗できませんでした。ここに旗が来る..ここに旗が来る ..
ティムポスト

2
@delnan-または、「Java(TM)SE Runtime Environment(build 1.6.0_25-b06)Java HotSpot(TM)64-Bit Server VM(build 20.0-b11)」と言うよりも「Java」と言う方がずっと簡単ですか、混合モード)」:-)
igouy

回答:


46

言語設計に関しては、一般的にJavaよりもGoを遅くするものは何もありません。実際、データ構造のメモリレイアウトをより細かく制御できるため、多くの一般的なタスクでは、多少速くなるはずです。ただし、現在のプライマリGoコンパイラ、スケジューラ、ガベージコレクタ、正規表現ライブラリ、およびその他の多くのものは特に最適化されていません。これは着実に改善されていますが、マイクロベンチマークでの勝利よりも有用で、シンプルで、高速であることに焦点が置かれているようです。

リンクされたベンチマークでは、Goはバイナリツリーと正規表現テストでJavaに大きく負けています。これらは、それぞれメモリ管理システムと正規表現ライブラリのテストです。Goのメモリ管理はより高速で、時間の経過とともに確実に改善される可能性があります。また、現在の標準の正規表現ライブラリは、まもなく実装されるより優れた実装のプレースホルダーです。したがって、これら2つを失うことは驚くことではなく、近い将来、マージンはより狭くなるはずです。

k-ヌクレオチドベンチマークの場合、Javaコードは別のアルゴリズムを使用しているように見えるため、比較がやや困難です。Goコードは、書かれたとしても、コンパイラ、スケジューラ、アロケータの改善から確実に恩恵を受けますが、より正確に比較したい場合は、誰かがGoコードを書き直してより賢い何かをする必要があります。

Javaはすべて浮動小数点演算とループであるため、マンデルブロベンチマークでJavaが勝ちます。これは、JVMが実行時に本当に優れたマシンコードを生成し、物を持ち上げるのに最適な場所です。それに比べて、Goは非常にシンプルなコンパイラを備えており、現在は非常にタイトなマシンコードを巻き上げたり、展開したり、生成したりしないため、失うことは驚くことではありません。ただし、JavaのタイミングはJVMの起動時間や、JVMが適切にJITを実行するために実行する必要がある回数をカウントしないことに注意してください。長時間実行されるプログラムの場合、これは関係ありませんが、場合によっては重要です。

残りのベンチマークに関しては、JavaとGoは基本的に首尾一貫しており、Goが消費するメモリとほとんどの場合コードが大幅に少なくなります。そのため、これらのテストの多くでGoはJavaよりも低速ですが、Javaは非常に高速であり、Goはそれと比較して非常に良好です。また、Goはおそらく近い将来に著しく高速になるでしょう。

gccgo(gcc codegenを使用するGoコンパイラ)が完成するのを楽しみにしています。これにより、多くの種類のコードでGoがCとほぼ一致するようになるはずです。


2
ソースコードを見て、何が行われているかを確認することが常に必要であることを理解するために、よくできました!
igouy

1
これらのプログラムのJava起動時間については、shootout.alioth.debian.org
help.php#java

2
それはまさに私が望んでいた答えの一種です、ありがとう!
グレッグドロドコヴィッツ

コードとメモリの使用量がはるかに少なく、マシンコードにコンパイルされ、設計が改善されています。これはすべて、速度の欠点を引き継ぎます。
モシェRevah

22
  1. どの問題が解決されたかは言うまでもなく、ベンチマーク全体は無意味です。
  2. JVMとCLRはどちらもJITを使用してマシンコードを生成します。これが遅くなる理由はありません。起動するのに年齢がかかるだけです。
  3. Goは、高速でビルドするように設計されています。コンパイル時間とブート時間の最適化のトンはありません。Goは、Javaアプリが起動するまでに独自の標準ライブラリをコンパイルします。

実行時にGoを高速化できますか?はい。Goは実行時に高速化されますか?知りません。おそらく、コンパイラビルダーは、コンパイル時間を犠牲にしてオプションの最適化を追加するでしょう。しかし、私は彼らがそれにあまり関心を持っているとは思わない。彼らはGoogleで働いています。
彼らが望んでいるのは、迅速な開発を可能にし、彼らの仕事を上手く実行する言語です。地獄、たとえそのベンチマークが信頼できたとしても、それらはCの半分の速度とPythonの14倍の速度であることを意味します。これで十分です。
ハードウェアは安く、コードは高価です。コードは、投資するにつれて大きくなり、遅くなる傾向があり、ハードウェアは安くなり小さくなります。有用な何かを達成するために4つのフレームワークと2000のクラスを必要としない言語が必要です。
Goの設計には固有のものはなく、それが遅くなります。しかし、Goのデザイナーには固有のものがあり、アセンブリよりも遅くなります。それは常識です。


1
ほとんどの(すべて?)JITは、コードが最初にロードされたときではなく、実行時にコンパイルされます。このマシンコードは、いくつかのコードのためのすべてで生成されない可能性があり、場合にも、容易例えば、無効にすることが可能objsfor (obj : objs) { obj.meth() }異なるの実装持ってmeth、それをインライン化するたびにとJIT試行を。もちろん、これはすべて一般的なケースでは実際には利点ですが、まだ注目に値します。

@delnan:V8は実行前にコードをJITします。また、LLVMはJITtingを念頭に置いて構築されているため、(もちろん多少の努力を払えば)コンパイル時に発生する最適化をジャストインタイムで実行できます。ただし、エスケープ分析などの特定の最適化は、実際にはJITでのみ機能します。
back2dos

3
>>どの問題が解決されたのかさえ言うことなく<< 実際、プログラムのソースコード、ビルドコマンド、コマンドの実行、言語実装バージョン、ya da ya da ya
igouy

10

またregex-dnaベンチマークではGoが特に遅いことに気付きましたラスコックスは、この特定のベンチマークでGoがそれほどパフォーマンスが高くなかった理由を説明しました。その理由は、Goの正規表現パッケージは、この特定のベンチマークではパフォーマンスが低いが、他のベンチマークでは大幅に高速になる可能性がある別のマッチングアルゴリズムを使用しているためです。また、Ruby、Python、およびその他のスクリプト言語は、別の正規表現マッチングアルゴリズムのC実装を使用しています

最後に、コンピューター言語ベンチマークゲームは、測定された言語の多くの特性を正確に反映せず、誤った印象を媒介する可能性のあるマイクロベンチマークで構成されています。Google最近公開したこの研究論文は、 Go、Scala、Java、C ++のいくつかの言語特性、特に「V.パフォーマンス分析」部分のより正確な概要を示しています。そのため、最終的にはGoはJavaとほぼ同じメモリ(Javaのメモリの81%)を消費し、Scalaと比べて170%も多くのメモリを消費します(JVMのメモリ消費が考慮されているかどうかは論文でわかりません)。

しかし、再び、Goの若く、まだ重い開発中です(APIの変更)!多くの改善がすぐに来ています。


3
>> Googleが最近発行したこの研究論文<<これは研究論文ではなく、Googleが発行したものでもありません。これは、「Scala Days 2011」Scalaワークショップで発表された1人のGoogle社員による経験報告です。
igouy

>>測定された言語の多くの特性を正確に反映せず、間違った印象を媒介することさえあります 実際、著者は次のように語っています。「マルチスレッドの側面や、より高レベルのタイプのメカニズムについては検討していません。重い数値計算も行いません...」
igouy

@igouy表紙では「Google」を読むことができ、関連するすべてのものが対応する参照で覆われています。では、Googleが本社住所とともに言及されているのに、なぜ「Googleが発行する研究論文」ではないのでしょうか。研究論文は学界だけの領域ではありません。
アレックス

表紙では、著者に連絡できる住所と著者のメールアドレスを読むことができます。投稿したPDFのURLを確認してください。days2011.scala-lang.org - - Scalaの日2011" Scalaのワークショップドメインに注意してください。
igouy

1

GoはPythonより速く、Javaより少し遅いです。私の大まかな経験から、GoはPythonよりもはるかに(1〜2桁)高速であり、Javaよりも約10〜20%遅いことがわかりました。ただし、Goはクアッドコア(x64)で使用した場合、Javaよりもわずかに高速です。Goは、メモリRAMの点でもはるかに効率的です。

GoのパフォーマンスとJavaおよびPythonの可能性についていくつかのポイントを追加したいと思います。Goは、Cが他のほとんどの言語よりも常に優れていることを可能にする、Cが行うことの多くを可能にします。キャッシュミスは、パフォーマンスの高いコードを避けるために非常に重要です。キャッシュミスを減らすには、データ構造のメモリレイアウトを制御する必要があります。Goはそれを可能にします。Javaは、メモリとキャッシュの破壊を避けることを難しくしません。

現在、Javaガベージコレクターははるかに洗練されているため、Javaは通常Goよりも高速に実行されます。Goガベージコレクターがこれほど優れている理由はありませんが。現時点では、Javaのコード生成の方がはるかに優れている可能性があります。Goには、ベクトル命令などのサポートなど、改善の可能性がたくさんあります。

だから、GoがJavaを追い越す前に、それは本当に時間の問題だと思う。他の言語コードと同様に、Goで記述されることで自動的に高速化されることはまずありません。言語が提供する機能を利用する必要があります。Goはコードを調整する機会を増やすだけだと思います。

とにかく、それは開発者の1つの経験にすぎません。


4
これは8年前の質問であり、安価な計算能力により、ほとんど無関係になりました。あなたの答えはまた、ハードデータではなく「あなたの気持ち」に基づいています。私は...あなたを阻止することを意味しますが、しないでください
Kayaman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.