2010-03-19 19 views
16

Soru aslında her şeyi söylüyor.Scala, Java ile karşılaştırıldığında ne kadar iyi performans gösteriyor?

Bu sorunun arkasında yatan neden, küçük bir proje başlatmak ve Scala numaralı telefondan yapmak istiyorum. Son bir aydır scala öğreniyorum ve şimdi onunla çalışmak konusunda rahatım. Scala derleyicinin kendisi oldukça yavaştır (fsc'u kullanmazsanız). Peki JVM'de ne kadar iyi performans gösteriyor? Daha önce çok çalıştım ve bazen java'dan daha fazla performans görmüştüm. Benim sorum JVM üzerinde Java ile karşılaştırıldığında ne kadar iyi performans gösteriyor. scala'un çok iyi özelliklere sahip olduğunu biliyorum (FP, dinamik lang, statik olarak yazılır ...) ama günün sonunda performansa ihtiyacımız var ...

+2

Scala derleyicisinin, Java derleyicisinden çok daha fazla işi olduğunu unutmayın. Sadece daha basit dillerde alışmış olduğunuz kadar hızlı olmayacağı beklenir. –

cevap

25

Çalışmamın çoğunluğu Scala'yı yüksek performanslı bir dil olarak kullanıyor. Eğer gerçekten performansa dikkat ederse, Scala neredeyse her zaman neredeyse Java kadar iyidir (eşdeğer değilse). Bir kişi dikkatsiz ise, örn. nesne yaratımları hakkında dikkatsiz olan bir kütüphane kullanıyorsanız, Java nesnesinde olduğu gibi nesne yaratımları, birçok kez daha kötü olabilir. (Aslında, Scala kodum genellikle Java kodumdan daha hızlıdır çünkü yüksek düzeyde optimize edilmiş kodumu kullanması ve yeniden kullanması çok daha kolay bir hale getiriyor. Ancak Java daha hızlı ve daha hızlı olabilirdi. sabır.)

Scala'nın temel olarak Java kadar hızlı olduğunu gösteren bazı veriler istiyorsanız, Computer Languages Benchmark Game'daki sonuçlara göz atın. (Yüksek verimli çok çekirdekli programlama için daha az kullanışlı ama yine de ilginç bir karşılaştırma, Tim Bray'in Wide Finder 2'udur. Bu, algoritmanın önceden tanımlanmadığı için daha az kullanışlıdır, bu yüzden farklılıkların büyük bir kısmı algoritmadaki farklılıklara karşılık gelir.)

+2

Modern bir Java JVM 1.5> Nesne oluşturma pratik olarak ücretsizdir, bu sadece FUD. Scala, tıpkı Groovy gibi tüm Scala'ya özgü dil özelliklerinin tümünün dolaylı olması nedeniyle yerel Java'dan daha yavaştır. Aynı JVM'de Java'ya kıyasla 5 kat hızlı ceza beklemeniz gerekir. –

+11

@Fuzzy: Sadece yanlış anlıyorsunuz. Git bağlandığım ölçütlere bak. Pozisyonunu destekliyorlar mı? Diğerlerini yayınlamayı önemsiyor musun? Nesne yaratmanın ne kadar hızlı bir şekilde bir indirgeme katmanı ile karşılaştırıldığını söylemek için mikro-işaretleme yaptınız - ve JIT gerçekten ihtiyaç duyulmadığında indirmeyi nasıl kaldırabilir? (İpucu: Bende, bu yüzden yaptığım şeyi yayınladım.) –

+10

@fuzzy Rex'i burada destekliyorum. Nesne oluşturma ucuzdur, ancak yaptığınız tek şey iç döngüde bir miktar matematik işlemiyse, o zaman karşılaştırma yaparak nesne yaratma oldukça pahalıdır. –

13

Scala, bayt koduna göre derlenmiştir ve statik olarak yazılmıştır, Java gibi statik olarak yazılan diller için (Groovy gibi dinamik olarak yazılan dillerden farklı olarak) yapılabilecek pek çok optimizasyon yapılabilir. Böylece Groovy ile Scala'yı karşılaştırmak elmaları portakallarla karşılaştırıyor.

Şimdi, Java Scala karşılaştırması:

Sen Scala çoğu durumlarda Java ile eşit olmasını bekleyebilirsiniz. Aptalca programlamak için Scala yavaş olabilir, ör., Traits aracılığıyla mix-ins sesleri, sade Java'nın sahip olamayacağı bazı ek yükleri sağlayabilir.

Ama ...

Özellikleri aslında iyi tadı karmaşık problem çözme, o zaman düz Java bir çözüm aynı karmaşıklığı mücadele etmesi gerekir. Kendi kalıplarınızı kullanarak Java'da yazdığınız çözümün Scala'da ücretsiz olarak aldığınızdan daha verimli olacağını kim söyleyebilir (hatırlayın, Scala derleyicisi muhtemelen sizden daha iyi bir programcı olan insanlar tarafından yazılmıştır).

Diğer yandan, iyi bir neden olmadan dil özellikleri kullanıyorsanız (örn., Düz int ilkellerin yapacağı Tamsayı nesneler), kullandığınız dilden bağımsız olarak kodunuz şişirilir, yavaş olur. Ayrıca, bir veritabanı veya diğer bir G/Ç yoğun kaynağıyla etkileşime giren özel istek-yanıt tabanlı uygulama sınıfını düşünün. Şişe boynu 'yeni' operatör veya sanal yöntem çağırma yükü olmayacak - neredeyse kesinlikle I/O olacaktır. Özetle, Scala ve Java arasındaki performans yaklaşık olarak aynıdır ve vakaların% 99'unda bir diğerini tercih etmenin en büyük nedeni olmamalıdır. Yetenekli insan emeği, bilgisayar donanımından daha pahalı olduğu için, (takım arkadaşlarınız dahil) en verimli şekilde programlayabileceğiniz (veya öğrenebileceğinizi) dili seçmekten daha iyidir. Scala kodu Java'nın onda birine yazabilmenizi sağlarsa, bunu kullanarak 10X kazanabilirsiniz.Scala sizi 10 kez yavaşlatırsa (okumak çok zor olduğu için) Java ile sopa!

+5

Bu, teoride doğrudur. Pratikte, sadece bir şeyler beklemek yerine bir şeyler ölçüyorsanız, uygulama kodu Java kodunun C++ kodundan daha yavaş olma eğiliminde olduğu gibi, Scala kodu da Java kodundan önemli ölçüde daha yavaş olma eğilimindedir. "Hız hakkında endişelenme, donanımı yavaş kodda atma" argümanı her gün daha az doğrudur. İstemci tarafında, netbook'lar ve cep telefonları hızlı DEĞİLDİR. Sunucu tarafı, enerji kullanımını azaltmak için baskı var. Elle ayarlanmış ASM'ye geri dönmeyeceğiz, ama Scala'nın sizi satın aldığını düşünmeye değer. – Porculus

+1

Aslında, Scala'dan Java'ya herhangi bir programı tek başına taşıyarak ölçülebilir bir hızlanma ile karşılaşamıyorum. –

+6

@Porculus: Fikrinizi desteklemek için gerçek verileriniz var mı? Java/C++ ile karşılaştırmanıza katılabilsem de, bunun Scala vs Java için nasıl geçerli olduğunu göremiyorum. GCC'nin, C++ için ayrıştırıcı B yerine, ayrıştırıcı A'yı kullandığınız için, GCC'nin önemli ölçüde daha yavaş olma eğilimi olan ikili dosyalar oluşturduğunu iddia etmekle aynıdır. – soc

5

Rex'in bu gönderideki yorumlarını kabul ediyorum ve bunu desteklemek için kişisel deneyimim var. Herhangi bir uygulama detayını değiştirmeden bir Uygulama uygulamasına java'dan scala'ya dönüştürdüm ve her iki uygulamada da küçük bir değişiklikle ~ 6 ms'de bir çerçeve oluşturuldu.

İlgili konular