Pourquoi l'ajout de la concurrence ralentit-il ce code Go ?
Le code fourni simule les interactions avec des monstres dans un jeu et la probabilité de chute d'objets lors de la défaite. Malgré les attentes selon lesquelles le code devrait être parfaitement adapté à la parallélisation, l'ajout de la concurrence l'a considérablement ralenti.
Explication :
Le problème réside dans l'utilisation de rand.Float64( ), qui repose sur un objet global partagé avec un verrou mutex. Lorsque plusieurs goroutines tentent d'utiliser cette fonction simultanément, elles rencontrent un conflit pour le verrou, ce qui entrave les performances.
Solution :
Pour résoudre le problème, créez une instance distincte de la structure Rand pour chaque goroutine et utilisez cette instance pour générer des nombres aléatoires. Cela élimine les conflits pour le verrouillage global et permet une véritable parallélisation.
Code mis à jour :
func interaction(generator *rand.Rand) int { if generator.Float64() <= DROP_RATE { return 1 } return 0 } func simulation(n int, generator *rand.Rand) []int { interactions := make([]int, n) for i := range interactions { interactions[i] = interaction(generator) } return interactions }
Performances améliorées :
Après avoir appliqué les correctifs pour créer de nouvelles instances Rand pour chaque goroutine, le code résultant montre une amélioration significative des performances. Le temps nécessaire à l'exécution des simulations est réduit d'environ 75 % lors de l'utilisation de deux processeurs.
Conclusion :
Lors de l'utilisation de la concurrence dans Go, évitez de vous fier au partage global Exemple Rand. Au lieu de cela, créez des instances distinctes de la structure Rand pour chaque goroutine afin de garantir des performances optimales.
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!