Maison > développement back-end > Golang > Pourquoi la concurrence ralentit-elle mon code Go à l'aide de « rand.Float64() » ?

Pourquoi la concurrence ralentit-elle mon code Go à l'aide de « rand.Float64() » ?

Linda Hamilton
Libérer: 2024-12-12 12:03:15
original
1003 Les gens l'ont consulté

Why Does Concurrency Slow Down My Go Code Using `rand.Float64()`?

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal