Я пробовал свои силы на Akka (Java API). Я попытался сравнить модель параллелизма Akka на основе акторов с моделью простой параллелизма Java (классы java.util.concurrent).
Вариант использования представлял собой простую каноническую карту, уменьшающую реализацию количества символов. Набор данных представлял собой набор случайно сгенерированных строк (длиной 400 символов) и рассчитывал количество гласных в них.
Для Akka я использовал BalancedDispatcher (для балансировки нагрузки между потоками) и RoundRobinRouter (чтобы ограничить действующие субъекты функций). Для Java я использовал простую технику форка соединения (реализованную без какого-либо алгоритма кражи работы), которая бы раскручивала карту / сокращала выполнение и объединяла результаты. Промежуточные результаты содержались в блокирующих очередях, чтобы сделать соединение как можно более параллельным. Возможно, если я не ошибаюсь, это каким-то образом имитирует концепцию «почтового ящика» актеров Акки, где они получают сообщения.
Наблюдение: До средних нагрузок (~ 50000 входных струн) результаты были сопоставимы, слегка варьируя в разные итерации. Однако, поскольку я увеличил свою нагрузку до ~ 100000, это повлияло на решение Java. Я настроил решение Java с 20-30 потоками при этом условии, и оно не получилось на всех итерациях.
Увеличение нагрузки до 1000000 также оказалось роковым для Акки. Я могу поделиться кодом со всеми, кто хочет пройти перекрестную проверку.
Поэтому мне кажется, что Akka масштабируется лучше, чем традиционное многопоточное решение Java. И, вероятно, причина кроется в магии Скалы.
Если я могу смоделировать проблемную область как передачу сообщений, управляемую событиями, я думаю, что Akka - хороший выбор для JVM.
Тест проводился на: версии Java: 1.6 IDE: Eclipse 3.7 Windows Vista 32 бит. 3 ГБ оперативной памяти. Процессор Intel Core i5, тактовая частота 2,5 ГГц
Обратите внимание, проблемный домен, используемый для теста, можно обсудить, и я постарался быть настолько справедливым, насколько позволял мой уровень знания Java :-)