Golang Go语言1.22:fastrand 变成 slowrand 了

今天在写 Kitex 框架关于负载均衡算法的源码解析,在跑 Benchmark 的时候突然发现我之前贡献的一个负载均衡算法性能有很大的倒退,折腾了好久都没明白,甚至把我当时本地的几个 commit 都签出测试还是一样

排查来排查去,感觉可能是依赖的 fastrand 有问题,框架里依赖的是字节的 fastrand

import "github.com/bytedance/gopkg/lang/fastrand"

但是我过去一看,这个 fastrand 已经两年没动过了,但是这个 fastrand 又依赖 runtimex 包里的 Fastrand(),这个包更是三年没动过了(

我就去看这个 runtimex 是什么东西

package runtimex

import ( _ “unsafe” // for linkname )

//go:linkname Fastrand runtime.fastrand func Fastrand() uint32

啊,原来是直接搬来的 runtime 里的 fastrand ,我一想,难道是 Go 的版本问题吗?

于是我写了个 Benchmark ,再把 Go 从 1.22 调到 1.21 ,卧槽,的确是这个原因

于是我在 Kitex 里也改成了 1.21 ,的确和当时一模一样了

我去 issue 和 PR 里找相关的内容,但是没找到,但这个 fastrand 肯定很多人都在用吧,怎么我成了第一个发现的了

于是我自己交了一个 PR bytedance/gopkg#206 ,但这个仓库好像已经不怎么维护了,一堆 issue 和 PR 挂着()

原因就是 1.22 的更新导致的,找到了一篇文章 https://zhuanlan.zhihu.com/p/673906980


Golang Go语言1.22:fastrand 变成 slowrand 了

更多关于Golang Go语言1.22:fastrand 变成 slowrand 了的实战教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

kitex-benchmark 后来按默认的脚本也跑不起来,不知道现在能不能跑了,kitex 代码太复杂我表示“看不懂”,所以不玩了,还是玩我自己的吧

连同 grpc ,都挺难用的

更多关于Golang Go语言1.22:fastrand 变成 slowrand 了的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


有可能在维护这个仓库的人被开源节流了

然后呢,是不是可以直接用 math/rand 了?

没对比,你可以自己性能测试一下

1.22 版本不是上了个 v2 版本的 rand 吗?估计改了不少内容。

go1.22 中有不少跟以前不兼容的地方,看官方的 ISSUE 就知道,破坏了不少兼容性

针对您提到的“Golang Go语言1.22:fastrand 变成 slowrand 了”这一话题,以下是我的专业回复:

在Go语言的最新进展中,关于fastrand变为slowrand的说法,实际上可能涉及对Go语言随机数生成器内部实现变化的一种误解或简化描述。在Go的源代码中,并没有直接名为slowrand的结构或函数,但确实存在对随机数生成速度和质量的权衡。

在Go 1.20及更早版本中,fastrand(快速随机数生成器)通常用于需要快速但不一定高质量随机数的场景。然而,为了增强安全性,Go语言团队一直在改进随机数生成器的实现,以确保即使在安全敏感的应用中也能提供足够的随机性和不可预测性。

在Go 1.22或后续版本中,如果开发者注意到随机数生成性能似乎有所下降,这可能是因为Go语言团队为了提升随机数生成的质量而做出的调整。这种调整可能涉及增加随机数生成的复杂性,从而在某些情况下导致性能略有下降,但整体上提高了随机数生成器的安全性和可靠性。

因此,虽然“fastrand 变成 slowrand”这一说法可能过于简化,但确实反映了Go语言在随机数生成方面做出的重要改进。开发者在使用Go语言的随机数生成功能时,应关注这些变化,并根据实际需求选择合适的随机数生成器。

回到顶部