Akka (Java API) üzerinde ellerimi deniyordum. Denediğim şey Akka'nın aktör tabanlı eşzamanlılık modelini düz Java eşzamanlılık modeliyle (java.util.concurrent sınıflar) karşılaştırmaktı.
Kullanım durumu, karakter sayısının uygulanmasını azaltan basit bir kanonik harita idi. Veri kümesi, rastgele oluşturulmuş dizelerin (400 karakter uzunluğunda) bir koleksiyonuydu ve buradaki ünlülerin sayısını hesapladı.
Akka için bir BalancedDispatcher (iş parçacıkları arasındaki yük dengelemesi için) ve RoundRobinRouter (fonksiyon aktörlerimi sınırlamak için) kullandım. Java için, yürütmeleri çatallandıracak / azaltacak ve sonuçlara katılacak basit çatal birleştirme tekniği (herhangi bir iş çalma algoritması olmadan uygulanmış) kullandım. Birleştirmeyi mümkün olduğunca paralel hale getirmek için ara sonuçlar blokaj sıralarında tutuldu. Muhtemelen, yanılmıyorsam, bir şekilde mesaj aldıkları Akka oyuncularının "posta kutusu" kavramını taklit ederdi.
Gözlem: Orta yüklere (~ 50000 dize girişi) kadar sonuçlar karşılaştırılabilir ve farklı iterasyonlarda biraz değişmiştir. Ancak, yükümü ~ 100000'e yükselttiğimde Java çözümünü asacaktı. Java çözümünü bu koşulda 20-30 iş parçacığı ile yapılandırdım ve tüm yinelemelerde başarısız oldu.
Yükü 1000000'e çıkarmak Akka için de ölümcüldü. Kodu çapraz kontrol etmek isteyen herkesle paylaşabilirim.
Bu yüzden benim için Akka, geleneksel Java çok iş parçacıklı çözümden daha iyi ölçekleniyor gibi görünüyor. Ve muhtemelen nedeni Scala'nın kaput büyüsünün altında.
Sorunlu bir etkiyi, olayı ileten bir mesaj olarak modelleyebilirsem, Akka'nın JVM için iyi bir seçim olduğunu düşünüyorum.
Test gerçekleştirildiği tarih: Java sürüm: 1.6 IDE: Eclipse 3.7 Windows Vista 32 bit. 3GB RAM. Intel Core i5 işlemci, 2,5 GHz saat hızı
Test için kullanılan sorun alanı tartışılabilir ve Java bilgimin izin verdiği kadar adil olmaya çalıştım :-)