La concurrence ralentit le code Golang
Dans le but d'optimiser le code simulant les interactions avec les monstres et les chutes d'objets, la concurrence a été introduite, affectant étonnamment les performances négativement.
Le code original, sans concurrence, avait trois fonctions principales : interaction, simulation et test. interaction simulait une seule interaction et renvoyait un 1 pour la suppression d'un élément ou un 0 dans le cas contraire. la simulation a exécuté plusieurs interactions et stocké les résultats dans une tranche. test a exécuté une série de simulations et stocké le nombre total d'interactions réussies dans une tranche.
Lorsque la concurrence a été ajoutée, des goroutines ont été créées pour chaque test, chaque goroutine s'exécutant avec sa propre copie de simulation. Cependant, les performances se sont détériorées au lieu de s'améliorer.
Raison du ralentissement
Le problème résidait dans la fonction rand.Float64(), qui utilise un objet global partagé avec un Mutex verrouillage. Par défaut, chaque goroutine acquerrait ce verrou Mutex lors de l'appel de rand.Float64(), ralentissant finalement les performances.
Solution
Pour résoudre ce problème, un rand distinct. Une instance New() a été créée pour chaque processeur. Cela a éliminé le problème de verrouillage Mutex partagé et amélioré considérablement les performances.
Amélioration supplémentaire
Un gain de performances supplémentaire a été obtenu en remplaçant la fonction pratique rand.Float64() par direct appels à la structure Rand. La fonction pratique utilise une instance Rand globale protégée par un mutex, tandis que les appels directs évitent cette surcharge.
Conclusion
Bien que la concurrence puisse améliorer les performances pour certains problèmes, une mise en œuvre appropriée est crucial. Dans ce cas, l'utilisation d'instances rand.New() distinctes et l'évitement des verrous Mutex partagés étaient essentiels pour minimiser la dégradation des performances.
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!