1. ホーム
  2. java

[解決済み] scala vs java、パフォーマンスとメモリ?[クローズド]

2022-04-24 01:27:42

質問

私はScalaについて熱心に調べていますが、1つの基本的な質問に対する答えを見つけることができないようです。 一般的に、ScalaとJavaの間には、パフォーマンスやメモリの使用量に違いがあるのでしょうか?

どのように解決するのですか?

Scalaでは、気づかないうちに膨大な量のメモリーを簡単に使用することができます。 これは通常、非常に強力ですが、時折、迷惑になることがあります。 例えば、文字列の配列( array ) と、それらの文字列からファイルへのマップ ( mapping ). 例えば、マップに含まれる、長さが2以上の文字列からなるファイルをすべて取得したいとします。 Javaでは、次のようになります。

int n = 0;
for (String s: array) {
  if (s.length > 2 && mapping.containsKey(s)) n++;
}
String[] bigEnough = new String[n];
n = 0;
for (String s: array) {
  if (s.length <= 2) continue;
  bigEnough[n++] = map.get(s);
}

ふぅー 大変だったね。 Scalaでは、同じことをするのに一番コンパクトな方法は

val bigEnough = array.filter(_.length > 2).flatMap(mapping.get)

楽勝! しかし、コレクションの仕組みによほど詳しい人でない限り、この方法では中間配列が余分に作成されていることに気づかないかもしれません (この配列には filter のオブジェクトが追加され、さらに 配列の各要素 (を使用)。 mapping.get これはオプションを返します)。 また、2つの関数オブジェクト(1つはフィルタ用、もう1つはflatMap用)が作成されますが、関数オブジェクトは小さいので、これはほとんど大きな問題ではありません。

つまり、基本的には、原始的なレベルでは、メモリの使用量は同じなのです。 しかし、Scalaのライブラリには、膨大な数の(通常は短命の)オブジェクトを非常に簡単に作成できる強力なメソッドが多数用意されています。 ガベージコレクタは通常、その種のゴミにかなり強いのですが、どのようなメモリが使われているかを全く知らずに行くと、おそらくJavaよりもScalaの方が早く問題に直面することになるはずです。

Computer Languages Benchmark GameのScalaコードは、Javaライクなパフォーマンスを得るために、かなりJavaライクなスタイルで書かれており、したがって、Javaライクなメモリ使用量になっていることに注意してください。 Scalaではこのようなことができます:高性能なJavaのコードのように見えるようにコードを書けば、高性能なScalaのコードになります。 (あなたは かもしれません より慣用的なScalaスタイルで書いても良いパフォーマンスが得られるかもしれませんが、それは仕様によります)。

プログラミングに費やした時間に対して、私のScalaコードは通常 より速く Scala では、パフォーマンスが重要でない面倒な部分をより少ない労力で終わらせ、パフォーマンスが重要な部分のアルゴリズムやコードの最適化にもっと注意を向けることができるからです。