Go1.22: fastrand 变成 slowrand 了

283 天前
 NX2023

今天在写 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

2482 次点击
所在节点    Go 编程语言
7 条回复
lesismal
283 天前
kitex-benchmark 后来按默认的脚本也跑不起来,不知道现在能不能跑了,kitex 代码太复杂我表示“看不懂”,所以不玩了,还是玩我自己的吧

连同 grpc ,都挺难用的
totoro52
283 天前
有可能在维护这个仓库的人被开源节流了
sealingpp
283 天前
牛的
thevita
283 天前
然后呢,是不是可以直接用 math/rand 了?
NX2023
283 天前
@thevita 没对比,你可以自己性能测试一下
dyllen
282 天前
1.22 版本不是上了个 v2 版本的 rand 吗?估计改了不少内容。
xiaocaiji111
277 天前
go1.22 中有不少跟以前不兼容的地方,看官方的 ISSUE 就知道,破坏了不少兼容性

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1022203

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX