web-dev-qa-db-ja.com

なぜgolangはscalaより遅いのですか?

この test では、golangのパフォーマンスがscalaよりもはるかに遅いことがあります。私の意見では、golangのコードはc/c ++互換バイナリコードに直接コンパイルされるため、scalaのコードはJVMバイトコードにコンパイルされるため、golangのパフォーマンスは特に優れていますベンチマークが行ったこれらの計算集約型アルゴリズム。

http://benchmarksgame.alioth.debian.org/u64/chartvs.php?r=eNoljskRAEEIAlPCA48ozD%2Bb1dkX1UIhzELXeGcih5BqXeksDvbs8Vgi9HFr23iGiD82SgxJqRWkKNctgkMVUfwlHXnZWDkut%2BMK1nGawoYeDLlYQ8eLG1tvF91Dd8NVGm4sBfGaYo0Pok0rWQ%3D%3D&m=eNozMFFwSU1WMDIwNFYoNTNRyAMAIvoEBA%3D%3D&w=eNpLz%2FcvTk7MSQQADkoDKg%3D%3D

20
Tyr

これは、goソリューションがscalaソリューションと比較して最も遅い4つのベンチマークで起こっていることです。

  1. mandelbrot:scala実装の内部ループは一度展開されます。JVMがこのような計算をベクトル化できる可能性もあります。まだありません。これは、手動による最適化に加えて、高速な算術のJVMサポートに優れています。
  2. regex-dna:scala実装はベンチマークに必要なものを実行していません:パターンをマッチ "-" "(一度に1つのパターン)に置き換えますリダイレクトファイルで、シーケンスの長さを記録します "" "が、長さを計算してそれを出力するだけです。goバージョンは一致置換を行うため、処理が遅くなります。
  3. k-ヌクレオチド:scala実装は、charを使用するのではなく、bit-twiddlingを使用してヌクレオチドをlongにパックすることにより最適化されています。 Goコードに適用されます。
  4. binary-trees:これはRAMを一杯にしてgcのパフォーマンスをテストします。 Java gcはgo gcよりもはるかに高速ですが、goの最優先事項ではないという主張は、通常、実際のプログラムでgcを生成しないことでgcを回避できることです最初の場所。
56
Paul Hankin

このチャートは、プログラミングシュートアウトからのものです。ベンチマークを福音と見なす前に、Shootoutページの免責事項をお読みください。せいぜいこれらのベンチマークは、パフォーマンスに対する幅広い期待を示すためにのみ役立ちます。

とはいえ、JVMには10年にわたる十分な資金による最適化があり、起動時間は別として、コードの実行に優れたパフォーマンスを提供します。 Goはまだ若い言語です。 GoがJVM言語の飛距離内にあるという事実は印象的です。 Goでプログラミングを楽しんでいる場合は、1つのベンチマークで拒否しないでください。

18
Brad Clawsie

これはgo [〜#〜] faq [〜#〜] で説明されています。

Goの設計目標の1つは、同等のプログラムのCのパフォーマンスにアプローチすることですが、いくつかのベンチマークでは、テスト/ベンチ/シュートアウトのいくつかを含め、かなり不十分です。最も遅いのは、同等のパフォーマンスのバージョンがGoで使用できないライブラリに依存しています。たとえば、pidigits.goは多精度数学パッケージに依存しており、CバージョンはGoとは異なり、GMP(最適化されたアセンブラーで記述されています)を使用します。正規表現に依存するベンチマーク(regex-dna.goなど)は、本質的にGoのネイティブregexpパッケージを、PCREなどの高度に最適化された成熟した正規表現ライブラリと比較しています。

ベンチマークゲームは広範なチューニングによって勝ち、ほとんどのベンチマークのGoバージョンに注意が必要です。同等のCおよびGoプログラム(reverse-complement.goがその一例です)を測定すると、このスイートが示すよりも2つの言語の生のパフォーマンスがはるかに近いことがわかります。

それでも、改善の余地があります。コンパイラーは優れていますが、より優れている可能性があり、多くのライブラリーは主要なパフォーマンス作業を必要とし、ガベージコレクターはまだ十分に高速ではありません。 (仮にそうであったとしても、不要なゴミを生成しないように注意することは大きな効果をもたらします。)

余談ですが、特定のプログラミング言語での ベンチマークの異なるバージョン の10倍(!)の速度の違いを考慮してください。 C gcc#7はC gcc#5の8.3倍遅く、Ada#3はAda#5のほぼ10倍遅いです。これらのベンチマークは、言語の比較方法の大まかなアイデアを提供しますが、GoとScalaの違いは1桁以内です。つまり、ランタイム間の「本質的な」変動は実装の違い: this post は、よりスマートなメモリ割り当てを実行することでプログラム11xを高速化する方法を説明します。これらの数字から、一般的なケースで「GoはScalaよりも遅い(または速い)」という結論を本当に引き出すことができるかどうかはわかりません。

14
val

あなたはこれらの偏ったベンチマークを見ることに熱心であるように見えるので。いくつかのフィボナッチ実装ではなく、実際のシナリオの実際の例を見てみましょう。

これらを参照してください rankings Webフレームワークのベンチマークでは、テストはネイティブクライアントが使用可能な場合は使用され、場合によってはOSS Webフレームワークを使用して行われ、同じ言語でテストするために多くのパッケージも使用されます。テストは、生の文字列の要求から、ORMを使用したデータベースのクエリまでさまざまです。

ScalaパフォーマンスはGoに近い場所ではない、すべてのテストでScalaはGoを下回っていた。これを言ったが、ベンチマークは近くないツール/機能の観点から、または単にあなたの問題を解決するのに最適なものを見ることを提案します。

11
ymg

ブラッドが指摘したように、これらの結果は特定のベンチマークスイートからのものです。これはsome情報を提供しますが、それが全体像であると仮定しないでください。各ケースでソースコードが十分に記述されていて、最速の速度、最小のメモリ使用量、またはその他の目標を達成できるかどうかを知ることは役立ちます。

おそらく、言語をランク付けする別のWebサイトと比較できます。 Webサービスコードが比較される http://www.techempower.com/benchmarks/ をご覧ください。若い言語であるにもかかわらず、Goはこれらのベンチマークのいくつかで最高の1つです。

すべてのベンチマークと同様に、それは常にあなたが何を目指して何を測定するかに依存します。

4
Rick-777