まず第一に、これはどちらが優れているかを判断するための言語-X-言語-Yの質問ではないことを明確にしたいと思います。
私はJavaを長い間使用しており、Javaを使用し続けるつもりです。これと並行して、私は現在非常に興味を持ってScalaを学んでいます。私の印象に慣れる小さなことは別として、私はこの言語で本当にうまく働くことができるということです。
私の質問は、Scalaで書かれたソフトウェアはJavaで書かれたソフトウェアと比較して、実行速度とメモリ消費量の点でどうですか?もちろん、これは一般的に答えるのが難しい質問ですが、パターンマッチング、高階関数などの高レベルの構成体がオーバーヘッドをもたらすと予想されます。
ただし、Scalaでの私の現在の経験は、コードが50行未満の小さな例に限定されており、これまでベンチマークを実行していません。したがって、実際のデータはありません。
ScalaにJava に対するオーバーヘッドがあることが判明した場合、Scala のより複雑な部分とJavaのパフォーマンスに重要な部分をコーディングするScala / Javaプロジェクトを混合するのは理にかなっていますか?これは一般的な習慣ですか?
編集1
私は小さなベンチマークを実行しました。整数のリストを作成し、各整数に2を掛けて新しいリストに入れ、結果のリストを出力します。Java実装(Java 6)とScala実装(Scala 2.9)を作成しました。Ubuntu 10.04でEclipse Indigoで両方を実行しました。
結果は比較可能です:Javaで480ミリ秒、Scalaで493ミリ秒(100回の繰り返しの平均)。ここに私が使用したスニペットがあります。
// Java
public static void main(String[] args)
{
long total = 0;
final int maxCount = 100;
for (int count = 0; count < maxCount; count++)
{
final long t1 = System.currentTimeMillis();
final int max = 20000;
final List<Integer> list = new ArrayList<Integer>();
for (int index = 1; index <= max; index++)
{
list.add(index);
}
final List<Integer> doub = new ArrayList<Integer>();
for (Integer value : list)
{
doub.add(value * 2);
}
for (Integer value : doub)
{
System.out.println(value);
}
final long t2 = System.currentTimeMillis();
System.out.println("Elapsed milliseconds: " + (t2 - t1));
total += t2 - t1;
}
System.out.println("Average milliseconds: " + (total / maxCount));
}
// Scala
def main(args: Array[String])
{
var total: Long = 0
val maxCount = 100
for (i <- 1 to maxCount)
{
val t1 = System.currentTimeMillis()
val list = (1 to 20000) toList
val doub = list map { n: Int => 2 * n }
doub foreach ( println )
val t2 = System.currentTimeMillis()
println("Elapsed milliseconds: " + (t2 - t1))
total = total + (t2 - t1)
}
println("Average milliseconds: " + (total / maxCount))
}
したがって、この場合、Scalaのオーバーヘッド(範囲、マップ、ラムダを使用)は本当に最小限であり、ワールドエンジニアが提供する情報からそれほど遠くないようです。
実行するのに特に重いので、注意して使用する必要がある他のScalaコンストラクトがあるかもしれません。
編集2
あなたの何人かは、内側のループのprintlnが実行時間の大部分を占めることを指摘しました。それらを削除し、リストのサイズを20000ではなく100000に設定しました。結果の平均は、Javaで88ミリ秒、Scalaで49ミリ秒でした。