gengine 的性能损耗这么大的吗?

2022-07-12 19:15:36 +08:00
 DuDuDu0o0

打算在业务内引入 gengine 作为热加载的业务逻辑判断&拦截,

测了下 gengine 的性能,感觉差得有点无法接受,如果我写的 benchmark 测试有问题,欢迎大佬指出

代码: https://gist.github.com/Jun10ng/cb3aad0f7191ed04c3b00ccfef889bc2

结果:以下是和 go 本身的逻辑对比。

goos: darwin
goarch: amd64
pkg: ruleng
cpu: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
BenchmarkGo-16                  607888363                2.233 ns/op           0 B/op          0 allocs/op
BenchmarkGengine-16               642663              1710 ns/op             592 B/op         13 allocs/op

1356 次点击
所在节点    程序员
4 条回复
chevalier
2022-07-13 00:21:23 +08:00
你的测试场景不太对。

首先生产环境如果你是高频的执行规则,应该做预加载+池化,gengine 有 pool 池,所以你应该用池化的方式来测试,然后测试时,预加载规则和池化不应该算进 benchmark ,用 StopTimer/StartTimer 略过,只比较执行规则的性能
DuDuDu0o0
2022-07-13 11:55:16 +08:00
@chevalier thank for your reply.

我写了 v2 版本的基准测试,使用了细化规则粒度并且并发执行,池化,用 ResetTimer 忽略了规则预加载和池化的时间,但是基准测试结果和第一版对比相差不大。如果我哪里使用方式不对,麻烦您斧正下。感谢。
v2 测试代码:
https://gist.github.com/Jun10ng/b7be36c97d092ed5a7f4d1b2e5d608e1
基准结果:
BenchmarkGo-16 527925068 2.095 ns/op 0 B/op 0 allocs/op
BenchmarkGengine-16 52290 23559 ns/op 864 B/op 21 allocs/op


by the way:我本来想去 github 社区里提问的,但是看 billbill/gengine 已经很久没人回复了。
DuDuDu0o0
2022-07-13 11:56:47 +08:00
@DuDuDu0o0
”但是基准测试结果和第一版对比相差不大 “
应为:
“对比第一版数据,又下降了一个数量级”

BenchmarkGengine-16 642663 1710 ns/op 592 B/op 13 allocs/op
BenchmarkGengine-16 52290 23559 ns/op 864 B/op 21 allocs/op
chevalier
2022-07-13 17:59:15 +08:00
@DuDuDu0o0 这个结果确实有点出乎意料...
我把你的代码 Pool 的模式改成了 1 顺序模式,然后用 pool.Execute ,达到了跟第一版同一个数量级。

我觉得你不如直接写在业务代码里面,然后对比一下压测数据,看下对接口 qps 的影响有多少?

gengine 看起来没人维护了,去年提的 pull request 都没人回复

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

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

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

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

© 2021 V2EX