首页 > 后端开发 > Golang > 为什么添加并发会减慢我的 Go 代码速度?

为什么添加并发会减慢我的 Go 代码速度?

DDD
发布: 2024-12-11 11:10:13
原创
405 人浏览过

Why Did Adding Concurrency Slow Down My Go Code?

并发会拖慢 Golang 代码

为了优化模拟与怪物交互和物品掉落的代码,引入了并发,这对性能产生了令人惊讶的影响

原始代码没有并发,主要功能有交互、模拟、测试三大功能。交互模拟单次交互,如果物品掉落则返回 1,否则返回 0。模拟执行多个交互并将结果存储在切片中。 test 运行了一系列模拟,并将成功交互的总数存储在一个切片中。

添加并发时,为每个测试创建 goroutine,每个 goroutine 都运行自己的模拟副本。然而,性能不但没有提高,反而恶化了。

速度缓慢的原因

问题在于 rand.Float64() 函数,该函数使用带有互斥体的共享全局对象锁。默认情况下,每个 goroutine 在调用 rand.Float64() 时都会获取此互斥锁,最终降低性能。

解决方案

要解决此问题,需要使用单独的 rand。为每个 CPU 创建了 New() 实例。这消除了共享互斥锁问题并显着提高了性能。

额外改进

通过使用直接替换 rand.Float64() 便利函数,实现了进一步的性能提升调用 Rand 结构。便利函数使用全局互斥保护的 Rand 实例,而直接调用则避免了这种开销。

结论

虽然并发可以提高某些问题的性能,但正确的实现至关重要。在这种情况下,使用单独的 rand.New() 实例并避免共享互斥锁是最大限度减少性能下降的关键。

以上是为什么添加并发会减慢我的 Go 代码速度?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板