まず第一に、これはどちらが優れているかを判断するための言語-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ミリ秒でした。