为什么添加并发会减慢此 Go 代码的速度?
提供的代码模拟了游戏中与怪物的交互以及物品掉落的可能性失败后。尽管期望代码应该完全适合并行化,但添加并发性显着减慢了速度。
说明:
问题在于 rand.Float64( ),它依赖于具有互斥锁的共享全局对象。当多个 goroutine 尝试同时使用此函数时,它们会遇到锁争用,从而影响性能。
解决方案:
要解决此问题,请创建一个单独的实例每个 goroutine 的 Rand 结构并使用该实例生成随机数。这消除了全局锁的争用并允许真正的并行化。
更新的代码:
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 }
改进的性能:
应用修复程序为每个 goroutine 创建新的 Rand 实例后,生成的代码显示出显着的改进 表现。使用两个处理器时,运行模拟所需的时间减少了约 75%。
结论:
在 Go 中使用并发时,避免依赖共享全局兰德实例。相反,为每个 goroutine 创建单独的 Rand 结构实例,以确保最佳性能。
以上是为什么使用'rand.Float64()”并发会减慢我的 Go 代码速度?的详细内容。更多信息请关注PHP中文网其他相关文章!