Maison >développement back-end >Golang >Pourquoi l'ajout de la concurrence a-t-il ralenti mon code Go ?

Pourquoi l'ajout de la concurrence a-t-il ralenti mon code Go ?

DDD
DDDoriginal
2024-12-11 11:10:13411parcourir

Why Did Adding Concurrency Slow Down My Go Code?

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!

Déclaration:
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