Her şeyden önce, bunun hangisinin daha iyi olduğunu belirlemek için bir dil-X-dil-dil-Y sorusu olmadığını açıkça belirtmek isterim.
Java'yı uzun zamandır kullanıyorum ve kullanmaya devam etmek istiyorum. Buna paralel olarak, şu anda Scala'yı büyük bir ilgi ile öğreniyorum: izlenimime alışması gereken küçük şeyler dışında, bu dilde gerçekten çok iyi çalışabileceğim.
Sorum şu: Scala'da yazılan yazılım, Java'da yazılan yazılımlarla yürütme hızı ve bellek tüketimi açısından nasıl kıyaslanıyor? Tabii ki, bu genel olarak cevaplanması zor bir sorudur, ancak desen eşleştirme, üst düzey işlevler vb.
Ancak, Scala'daki mevcut deneyimim, 50 kod satırı altındaki küçük örneklerle sınırlıdır ve şu ana kadar herhangi bir karşılaştırma yapmadım. Yani, gerçek verilerim yok.
Scala’nın bazı genel giderler Java’ya sahip olduğu ortaya çıktıysa, Scala’da daha karmaşık parçaları ve Java’da kritik performans gösteren parçaları kodlayan karışık Scala / Java projelerinin yapılması mantıklı geliyor mu? Bu yaygın bir uygulama mı?
1 EDIT
Küçük bir kıyaslama yaptım: bir tamsayı listesi oluşturun, her bir tamsayıyı iki ile çarpın ve yeni bir listeye koyun, sonuç listesini yazdırın. Bir Java uygulaması (Java 6) ve Scala uygulaması (Scala 2.9) yazdım. İkisini de Eclipse Indigo'da Ubuntu 10.04 altında çalıştırdım.
Sonuçlar karşılaştırılabilir: Java için 480 ms ve Scala için 493 ms (100 yineleme üzerinden ortalama). İşte kullandığım pasajlar.
// 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))
}
Dolayısıyla, bu durumda Scala ek yükünün (aralık, harita, lambda kullanarak) gerçekten çok düşük olduğu görülüyor ve bu da World Engineer tarafından sağlanan bilgilerden çok uzak değil.
Belki de yürütülmesi özellikle ağır olduğu için dikkatle kullanılması gereken başka Scala yapıları vardır.
EDIT 2
Bazılarınız, iç döngüdeki baskının, yürütme zamanının çoğunu aldığını belirtti. Bunları sildim ve listelerin boyutunu 20000 yerine 100000 olarak belirledim. Elde edilen ortalama Java için 88 ms ve Scala için 49 ms idi.