并发会拖慢 Golang 代码
为了优化模拟与怪物交互和物品掉落的代码,引入了并发,这对性能产生了令人惊讶的影响
原始代码没有并发,主要功能有交互、模拟、测试三大功能。交互模拟单次交互,如果物品掉落则返回 1,否则返回 0。模拟执行多个交互并将结果存储在切片中。 test 运行了一系列模拟,并将成功交互的总数存储在一个切片中。
添加并发时,为每个测试创建 goroutine,每个 goroutine 都运行自己的模拟副本。然而,性能不但没有提高,反而恶化了。
速度缓慢的原因
问题在于 rand.Float64() 函数,该函数使用带有互斥体的共享全局对象锁。默认情况下,每个 goroutine 在调用 rand.Float64() 时都会获取此互斥锁,最终降低性能。
解决方案
要解决此问题,需要使用单独的 rand。为每个 CPU 创建了 New() 实例。这消除了共享互斥锁问题并显着提高了性能。
额外改进
通过使用直接替换 rand.Float64() 便利函数,实现了进一步的性能提升调用 Rand 结构。便利函数使用全局互斥保护的 Rand 实例,而直接调用则避免了这种开销。
结论
虽然并发可以提高某些问题的性能,但正确的实现至关重要。在这种情况下,使用单独的 rand.New() 实例并避免共享互斥锁是最大限度减少性能下降的关键。
以上是为什么添加并发会减慢我的 Go 代码速度?的详细内容。更多信息请关注PHP中文网其他相关文章!