在此 Go 代码中,test() 函数并行运行多个模拟。然而,添加并发会降低程序速度。
问题在于模拟如何与随机数生成器交互。默认情况下,Go rand 包使用 Rand 类型的全局实例,并受互斥锁保护。当使用便捷函数 rand.Float64() 时,每个 goroutine 都必须获取此锁,从而产生了减慢程序速度的瓶颈。
并行化代码实际上,为每个 goroutine 创建一个单独的 Rand 类型实例。这消除了对互斥锁的需要,并允许 goroutine 独立运行。
示例代码:
// Create a new Rand instance for each goroutine source := rand.NewSource(time.Now().UnixNano()) generator := rand.New(source)
用法:
将生成器实例传递给交互()和模拟()等函数以生成没有互斥锁的随机数锁争用。
result := interaction(generator)
通过解决互斥锁问题,代码现在可以充分利用并发性来加速模拟。
以上是为什么并发会减慢我的围棋物品掉落模拟速度,如何解决?的详细内容。更多信息请关注PHP中文网其他相关文章!