Saya mencoba tangan saya pada Akka (Java api). Apa yang saya coba adalah membandingkan model konkurensi berbasis aktor Akka dengan model konkurensi Java biasa (kelas java.util.concurrent).
Kasus penggunaan adalah peta kanonik sederhana mengurangi implementasi jumlah karakter. Dataset adalah kumpulan string yang dihasilkan secara acak (panjang 400 karakter), dan menghitung jumlah vokal di dalamnya.
Untuk Akka saya menggunakan BalancedDispatcher (untuk load balancing di antara utas) dan RoundRobinRouter (untuk menjaga batas pada aktor fungsi saya). Untuk Java, saya menggunakan teknik fork join sederhana (diimplementasikan tanpa algoritma mencuri pekerjaan) yang akan memetakan / mengurangi eksekusi dan menggabungkan hasilnya. Hasil antara diadakan dalam memblokir antrian untuk membuat sambungan sejajar mungkin. Mungkin, jika saya tidak salah, itu akan meniru konsep "kotak surat" aktor Akka, di mana mereka menerima pesan.
Pengamatan: Hingga beban menengah (~ input string 50000) hasilnya sebanding, sedikit berbeda dalam iterasi yang berbeda. Namun, ketika saya menambah beban saya ke ~ 100000, itu akan menggantung solusi Java. Saya mengkonfigurasi solusi Java dengan 20-30 utas di bawah kondisi ini dan gagal di semua iterasi.
Meningkatkan muatan menjadi 10.000, juga berakibat fatal bagi Akka. Saya dapat berbagi kode dengan siapa pun yang tertarik untuk melakukan pemeriksaan silang.
Jadi bagi saya, tampaknya Akka lebih baik daripada solusi multithreaded Java tradisional. Dan mungkin alasannya adalah sihir Scala di bawah tenda.
Jika saya bisa memodelkan domain masalah sebagai pesan yang didorong oleh peristiwa lewat satu, saya pikir Akka adalah pilihan yang baik untuk JVM.
Tes dilakukan pada: Versi Java: 1.6 IDE: Eclipse 3.7 Windows Vista 32 bit. Ram 3GB. Prosesor Intel Core i5, kecepatan clock 2,5 GHz
Harap dicatat, domain masalah yang digunakan untuk pengujian dapat diperdebatkan dan saya mencoba untuk bersikap adil sejauh pengetahuan Java saya diizinkan :-)