Pertama-tama saya ingin menjelaskan bahwa ini bukan pertanyaan bahasa-X-versus-bahasa-Y untuk menentukan mana yang lebih baik.
Saya telah menggunakan Java untuk waktu yang lama dan saya bermaksud untuk terus menggunakannya. Sejalan dengan ini, saya saat ini sedang mempelajari Scala dengan minat besar: terlepas dari hal-hal kecil yang membuat saya terbiasa dengan kesan saya adalah bahwa saya benar-benar dapat bekerja dengan sangat baik dalam bahasa ini.
Pertanyaan saya adalah: bagaimana peranti lunak yang ditulis dalam Scala dibandingkan dengan peranti lunak yang ditulis dalam Java dalam hal kecepatan eksekusi dan konsumsi memori? Tentu saja, ini adalah pertanyaan yang sulit dijawab secara umum, tetapi saya berharap bahwa konstruksi tingkat yang lebih tinggi seperti pencocokan pola, fungsi tingkat tinggi, dll, memperkenalkan beberapa overhead.
Namun, pengalaman saya saat ini di Scala terbatas pada contoh kecil di bawah 50 baris kode dan saya belum menjalankan tolok ukur apa pun hingga saat ini. Jadi, saya tidak punya data nyata.
Jika ternyata Scala memiliki beberapa overhead overhead Java, apakah masuk akal untuk menggabungkan proyek Scala / Java, di mana orang mengkode bagian yang lebih kompleks di Scala dan bagian yang kritis terhadap kinerja di Jawa? Apakah ini praktik umum?
EDIT 1
Saya telah menjalankan patokan kecil: buat daftar bilangan bulat, kalikan setiap bilangan bulat dengan dua dan masukkan ke dalam daftar baru, cetak daftar yang dihasilkan. Saya menulis implementasi Java (Java 6) dan implementasi Scala (Scala 2.9). Saya telah menjalankan keduanya di Eclipse Indigo di bawah Ubuntu 10.04.
Hasilnya sebanding: 480 ms untuk Java dan 493 ms untuk Scala (rata-rata lebih dari 100 iterasi). Berikut cuplikan yang saya gunakan.
// 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))
}
Jadi, dalam hal ini tampaknya overhead Scala (menggunakan rentang, peta, lambda) sangat minim, yang tidak jauh dari informasi yang disediakan oleh World Engineer.
Mungkin ada konstruksi Scala lain yang harus digunakan dengan hati-hati karena sangat berat untuk dieksekusi?
EDIT 2
Beberapa dari Anda menunjukkan bahwa println yang ada di loop dalam mengambil sebagian besar waktu eksekusi. Saya telah menghapusnya dan mengatur ukuran daftar menjadi 100.000 bukan 20.000. Rata-rata yang dihasilkan adalah 88 ms untuk Java dan 49 ms untuk Scala.