J'essayais mes mains sur Akka (Java api). J'ai essayé de comparer le modèle de concurrence basé sur les acteurs d'Akka avec celui du modèle de concurrence Java simple (classes java.util.concurrent).
Le cas d'utilisation était une simple carte canonique réduisant la mise en œuvre du nombre de caractères. L'ensemble de données était une collection de chaînes générées de façon aléatoire (400 caractères de long) et calculait le nombre de voyelles qu'elles contiennent.
Pour Akka, j'ai utilisé un BalancedDispatcher (pour l'équilibrage de charge entre les threads) et RoundRobinRouter (pour garder une limite sur mes acteurs de fonction). Pour Java, j'ai utilisé une technique de jonction de fourche simple (mise en œuvre sans aucun algorithme de vol de travail) qui permettrait de mapper / réduire les exécutions et de joindre les résultats. Des résultats intermédiaires ont été conservés dans les files d'attente de blocage pour rendre même la jonction aussi parallèle que possible. Probablement, si je ne me trompe pas, cela imiterait en quelque sorte le concept de "boîte aux lettres" des acteurs Akka, où ils reçoivent des messages.
Observation: Jusqu'à des charges moyennes (~ 50000 entrée de chaîne), les résultats étaient comparables, variant légèrement selon les différentes itérations. Cependant, comme j'augmentais ma charge à ~ 100 000, cela bloquait la solution Java. J'ai configuré la solution Java avec 20-30 threads dans cette condition et elle a échoué dans toutes les itérations.
L'augmentation de la charge à 1000000 a également été fatale pour Akka. Je peux partager le code avec toute personne intéressée pour avoir une contre-vérification.
Donc pour moi, il semble qu'Akka évolue mieux que la solution multithread Java traditionnelle. Et probablement la raison en est la magie sous le capot de Scala.
Si je peux modéliser un domaine problématique comme un message événementiel en passant, je pense que Akka est un bon choix pour la JVM.
Test effectué sur: Version Java: 1.6 IDE: Eclipse 3.7 Windows Vista 32 bits. 3 Go de RAM. Processeur Intel Core i5, vitesse d'horloge de 2,5 GHz
Veuillez noter que le domaine problématique utilisé pour le test peut être débattu et j'ai essayé d'être aussi juste que mes connaissances Java le permettaient :-)