囲碁は、「金属の近く」で実行されるはずの数少ない言語の1つです。 e。コンパイルされ、静的に型付けされ、VMなしでネイティブにコードを実行します。これにより、JavaやC#などに比べて速度が向上します。しかし、それはJavaの後ろにあるようです( Programming Language Shootout を参照))
成熟度の低いコンパイラがこれに大きく関与していると思いますが、他に理由はありますか? Goの設計には、たとえばJavaよりも高速に実行できない原因はありますか?私はランタイムモデルについて非常に洗練されていない見解を持っていますが、ネイティブコードの実行により、少なくとも原則としてJavaよりも高速に実行できるはずです。
言語設計に関しては、一般的にGoをJavaよりも遅くする必要があるものは実際にはありません。実際、データ構造のメモリレイアウトをより詳細に制御できるため、多くの一般的なタスクでは、多少高速になるはずです。ただし、現在の主要なGoコンパイラー、スケジューラー、ガベージコレクター、正規表現ライブラリ、およびその他の多くのものは、特に最適化されていません。これは着実に改善されていますが、焦点は、マイクロベンチマークで勝つことよりも、使いやすく、シンプルで、十分に高速であることです。
リンクされたベンチマークでは、GoはバイナリツリーとregexpテストでJavaに大きく負けています。これらは、それぞれメモリ管理システムと正規表現ライブラリのテストです。 Goのメモリ管理はより高速で、時間の経過とともに確実に改善される可能性があります。現在の標準正規表現ライブラリは、まもなく登場するはるかに優れた実装のプレースホルダーです。したがって、これら2つを失うことは驚くことではなく、近い将来、マージンはさらに狭くなるはずです。
Kヌクレオチドベンチマークの場合、Javaコードは別のアルゴリズムを使用しているように見えるため、比較するのは少し難しいです。 Goコードは、記述されているとおり、コンパイラー、スケジューラー、アロケーターの改善により確実にメリットを得られますが、より正確に比較したい場合は、誰かがGoコードを書き直して何か賢いことを行う必要があります。
Javaはすべてが浮動小数点演算とループであるため、マンデルブロベンチマークで勝っています。これは、JVMが非常に優れたマシンコードを生成し、実行時に物事を持ち上げるのに最適な場所です。それに比べて、Goには、非常に単純なコンパイラーがあり、現時点では巻き上げたり、展開したり、非常にタイトなマシンコードを生成したりしないので、それが失われるのも当然です。ただし、Javaのタイミングでは、JVMの起動時間や、JVMが適切にJITを実行するために実行する必要がある回数はカウントされないことに注意してください。長期実行プログラムの場合、これは関係ありませんが、場合によっては問題になります。
残りのベンチマークと同様に、JavaとGoは基本的にネックインネックであり、Goのメモリ使用量は大幅に少なく、ほとんどの場合コードも少なくなっています。これらのテストの多くでは、GoはJavaよりも低速ですが、Javaはかなり高速ですが、Goは比較的優れており、近い将来、Goは著しく高速になるでしょう。 。
Gccgo(gcc codegenを使用するGoコンパイラー)が成熟するのを楽しみにしています。これにより、Goは多くのタイプのコードでCにほぼ一致するはずです。これは興味深いことです。
Goは実行時に高速化できますか?はい。 Goは実行時により速くなりますか?知りません。多分コンパイラビルダーはコンパイル時間を犠牲にしてオプションの最適化を追加するでしょう。しかし、私は彼らがそれほど関心を持っているとは思いません。彼らはグーグルで働いています。
彼らが望んでいるのは、迅速な開発を可能にし、彼らが何をするかで良いパフォーマンスを発揮する言語です。地獄は、たとえそのベンチマークが信頼できるものであったとしても、それらはCの半分の速度でPythonの14倍の速度であることを意味します。これで十分です。
ハードウェアは安価で、コードは高価です。お金をかけるとコードは大きくなり、遅くなる傾向があります。ハードウェアはより安く、より小さくなります。必要なものをすべて実現するために4つのフレームワークと2000個のクラスを必要としない言語が必要です。
Goの設計には本質的に何もないため、遅くなります。ただし、Goのデザイナーには固有のものがあります。それにより、アセンブリよりも遅くなります:常識。
私も気づきましたregex-dnaベンチマークでGoが特に遅いこと。 Russ Coxは、Goがこの特定のベンチマークでそのパフォーマンスを発揮しなかった理由を説明しました 。その理由は、Goのregexpパッケージが 異なるマッチングアルゴリズム を使用しているためです。この特定のベンチマークではパフォーマンスが低下しますが、他のベンチマークよりもはるかに速く。また、Ruby、Pythonおよびその他のスクリプト言語は別の正規表現マッチングアルゴリズムのC実装を使用しています。
最後に Computer Language BenchmarksGame は、測定された言語の多くの特性を正確に反映しておらず、仲介することさえできないマイクロベンチマークで構成されています間違った印象。この 研究論文は、最近Googleが発行したものですは、Go、Scala、Java and C++ —特に「V. Performance Analysis」の部分なので、最終的には、GoはJava(Javaのメモリの81%))とほぼ同じくらいメモリを消費し、消費しますScala)の170%のメモリでも(JVMのメモリ消費が考慮されているかどうかは、この論文では見つかりませんでした)。
しかし、繰り返しになりますが、Goは若く、まだ開発が進んでいます(APIの変更)。多くの改善がすぐに来ています。
GoはPythonよりも速く、Javaよりも少し遅いです。私の大まかな経験では、GoはPythonよりもはるかに速く(1〜2桁)、Javaよりも10〜20%遅くなっています。ただし、クアッドコア(x64)で使用した場合、GoはJavaよりもわずかに高速です。 Goは、メモリRAMの面でもはるかに効率的です。
GoのパフォーマンスとJavaおよびPythonの可能性についていくつかの点を追加したいと思います。 Goは、Cが行うことの多くを可能にします。これにより、Cは他のほとんどの言語より常に優れたパフォーマンスを発揮します。キャッシュミスは、高性能コードを回避するために非常に重要です。キャッシュミスを減らすには、データ構造のメモリレイアウトを制御する必要があります。 Goはそれを可能にします。 Javaは、メモリとキャッシュのフラクチャを回避することを難しくしません。
現在、Javaは、Goよりも高速に実行されます。これは、Javaガベージコレクタがはるかに洗練されているためです。理由はありませんが、Goガベージコレクターの方がはるかに優れていることはありません。現時点では、コード生成もJavaの方がはるかに優れています。 Goには、改善の余地がたくさんあります。ベクトル命令などのサポートあり.
ですから、GoがJavaを通過するまでの時間の問題だと思います。他の言語のコードと同様に、Goで記述されているため、自動的に高速になる可能性はほとんどありません。言語が提供する機能を利用する必要があります。 Goはコードを調整する機会を増やすだけだと思います。
とにかく、それは1つの開発者の経験にすぎません。