2011-12-13 24 views
7

scalacl plugin kullanmayla ilgili herhangi bir olumsuzluk var mı?Dizi performansı ile scala işlemleri (scalacl eklentisi)

Projemde scala kullanmayı planlıyorum. Yürütme süresini görmek için scala'da biraz kod yazdım.

eklentisi olmadan

(1 to 1000000).map(1 + _).sum 

1. Böyle bir şey için derlendi: yaklaşık 375 ms scalacl eklenti sayesinde

2.

BoxesRunTime.unboxToInt(((TraversableOnce)Predef..MODULE$.intWrapper(1).to(1000000).map(new MyScala..anonfun.1(), IndexedSeq..MODULE$.canBuildFrom())).sum(Numeric.IntIsIntegral..MODULE$)); 

ve çalıştırmak

int i = 1; 
int j = 1000000; 
int k = j; 
int m = i; 
for (VectorBuilder localVectorBuilder = new VectorBuilder(); m <= k;) { 
    int n = m; 
    localVectorBuilder.$plus$eq(BoxesRunTime.boxToInteger(1 + n)); 
    m += 1; 
} 
int a = BoxesRunTime.unboxToInt(localVectorBuilder.result().sum(Numeric.IntIsIntegral..MODULE$)); 

259 ms

Aklıma
+2

% 30 iyileştirme çok fazla değil. Şimdi kodlarımın bir bölümünü optimize ettim, şimdi dizileri kullanan ve döngüler 100x hız için. Deyimsel Scala gerçekten yavaş olabilir. Örneğin, bokstan kurtulursanız, daha etkileyici bir şey elde edersiniz. – ziggystar

+0

Btw, 'Range # sum' şimdi gövde içinde en iyi duruma getirildi ve sabit zamanda (O) n 'yerine lineer' O (n) 'olarak çalışıyor. Algoritmik gelişmeler çoğu zaman tercih edilir. – soc

cevap

10

Olası eksileri:

1) döngü optimizasyonu çalışması için görünür ve geliştirici çok yetkin görünüyor, ama "Hakkında ScalaCL" ekranında kalın harflerle diyor " ScalaCL üretime hazır değil! "Başka bir deyişle, hataları ve kararsızlığı tanıtabileceğiniz küçük bir olasılık var.

2) Eklentiyi her zaman derlemeyi unutmamalısınız, aksi halde aniden performansınızla karşılaşabilirsiniz. Eklentinin orta veya uzun vadede korunacağından/uyumlu olduğundan emin olun

3) Optimize edilmesine güvenerek, verimsiz kod yazmanıza yol açabilir, oysa darboğazları tanımlamak ve el ile optimize etmek daha hızlı kodlara yol açabilir Başka bir deyişle, "çatlakların üzerinde kağıt" etkisi olabilir

4) Ek kütüphane bağımlılığıdır ve yapı dosyalarınıza karmaşıklık katar.

Eksileri sordunuz, ancak bunlar profesyonellere kıyasla oldukça küçük. Şahsen ben kişisel projeler için döngü optimizasyonları kullanmaktan çekinmeyeceğim; henüz cl-collections hakkında çok emin değilim (onları denedim ve GPU'yu CPU'mdan biraz daha yavaş buldu - obv, mevcut donanıma bağlı), ama bence projenin kendisi ya da standart derleyici ve kütüphaneler. Bazı kodlar için çok dramatik hızlandırmalar gördüm (20x daha hızlı).