Maison >Java >javaDidacticiel >Pourquoi l'algorithme de tamisage simultané d'Eratosthène est-il plus lent que la version séquentielle ?
On suppose généralement que les algorithmes concurrents sont plus rapides que les algorithmes séquentiels. Cependant, dans le code donné, la version concurrente de l’algorithme Sieve of Eratosthène est plus lente que la version séquentielle. Cet article explore les raisons de ce résultat inattendu, met en évidence les problèmes potentiels dans le code fourni et suggère quelques optimisations pour améliorer les performances des implémentations séquentielles et simultanées.
La classe PrimesSeq implémente la version séquentielle de l'algorithme Sieve d'Eratosthène. Il utilise un tableau d'octets bitArr pour représenter le tamis. Chaque bit du tableau représente un nombre, et si le bit est défini, le nombre est marqué comme non premier. L'algorithme parcourt le tamis, en commençant à partir de 2, et marque tous les multiples du nombre actuel comme non premiers. La fonction isPrime vérifie si un nombre est premier en vérifiant si le bit correspondant dans le tamis n'est pas défini. La fonction printAllPrimes imprime tous les nombres premiers trouvés par l'algorithme.
La classe PrimesPara implémente la version concurrente de l'algorithme Sieve d'Eratosthène. Il divise le tamis en plusieurs morceaux et attribue chaque morceau à un thread distinct. Chaque fil est chargé de marquer les multiples des nombres qui lui sont attribués comme non premiers. Le thread principal est responsable de la génération des nombres premiers initiaux et du démarrage des threads. La fonction crossOut est utilisée pour marquer un nombre comme non premier. La fonction generateErastothenesConcurrently génère les nombres premiers simultanément.
Dans le code donné, la version concurrente de l'algorithme est environ 10 fois plus lente que la version séquentielle. Ceci est inattendu car les algorithmes simultanés sont généralement plus rapides que les algorithmes séquentiels.
Il existe quelques goulots d'étranglement potentiels dans le code fourni :
Quelques optimisations peuvent être appliquées à la fois aux implémentations séquentielles et simultanées :
Alors que les algorithmes concurrents sont généralement plus rapides que les algorithmes séquentiels ceux-ci, il existe des cas où l'algorithme séquentiel peut être plus rapide. Dans le cas de l'algorithme Sieve d'Eratosthène, la surcharge de création et de synchronisation des threads, le faux partage et le déséquilibre de charge peuvent contrebalancer les avantages de la concurrence.
En appliquant les optimisations décrites dans cet article, il est possible de améliorer les performances des implémentations séquentielles et simultanées de l'algorithme Sieve of Eratosthenes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!