首页 >后端开发 >Golang >为什么使用'rand.Float64()”并发会减慢我的 Go 代码速度?

为什么使用'rand.Float64()”并发会减慢我的 Go 代码速度?

Linda Hamilton
Linda Hamilton原创
2024-12-12 12:03:151004浏览

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

为什么添加并发会减慢此 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn