高性能定时器,基于 5 级时间轮实现。fast,fast,fast

2020-06-16 10:28:00 +08:00
 guonaihong

timer

timer 是一个高性能定时器库。

项目地址

https://github.com/antlabs/timer

example

import (
    "github.com/antlabs/timer"
    "log"
)

func main() {
        tm := timer.NewTimer()

        tm.AfterFunc(1*time.Second, func() {
                log.Printf("after\n")
        })

        tm.AfterFunc(10*time.Second, func() {
                log.Printf("after\n")
        })
        tm.Run()
}

benchmark

压测代码仓库位置

https://github.com/antlabs/timer-benchmark

Benchmark_antlabs_Timer_AddTimer 是本库压测数据,从结果上看,性能表现最好。 go 1.13.5

goos: linux
goarch: amd64
pkg: benchmark
Benchmark_antlabs_Timer_AddTimer/N-1m-16        	 9177537	       124 ns/op
Benchmark_antlabs_Timer_AddTimer/N-5m-16        	10152950	       128 ns/op
Benchmark_antlabs_Timer_AddTimer/N-10m-16       	 9955639	       127 ns/op
Benchmark_RussellLuo_Timingwheel_AddTimer/N-1m-16         	 5316916	       222 ns/op
Benchmark_RussellLuo_Timingwheel_AddTimer/N-5m-16         	 5848843	       218 ns/op
Benchmark_RussellLuo_Timingwheel_AddTimer/N-10m-16        	 5872621	       231 ns/op
Benchmark_ouqiang_Timewheel/N-1m-16                       	  720667	      1622 ns/op
Benchmark_ouqiang_Timewheel/N-5m-16                       	  807018	      1573 ns/op
Benchmark_ouqiang_Timewheel/N-10m-16                      	  666183	      1557 ns/op
Benchmark_Stdlib_AddTimer/N-1m-16                         	 8031864	       144 ns/op
Benchmark_Stdlib_AddTimer/N-5m-16                         	 8437442	       151 ns/op
Benchmark_Stdlib_AddTimer/N-10m-16                        	 8080659	       167 ns/op

3746 次点击
所在节点    Go 编程语言
16 条回复
songjiaxin2008
2020-06-16 10:36:19 +08:00
好奇这个 5 级是怎么摸索出来的?经验值?
wysnylc
2020-06-16 11:35:13 +08:00
@songjiaxin2008 #1 新手村做完 3 个任务即可
Vegetable
2020-06-16 11:38:29 +08:00
想知道使用场景,有点懵逼,Golang 这样语言好像不是很适合这种场景呢
sadfQED2
2020-06-16 12:14:51 +08:00
@Vegetable crontab 没法支持毫秒级定时任务,用这种框架搭一个定时任务服务器
reus
2020-06-16 13:49:57 +08:00
1.13 比个屁,1.14 定时器有大改进
guonaihong
2020-06-16 16:24:04 +08:00
@reus 请看看下压测项目,有 go 1.14.4
guonaihong
2020-06-16 16:24:25 +08:00
@reus go1.14.4
goos: linux
goarch: amd64
pkg: benchmark
Benchmark_antlabs_Timer_AddTimer/N-1m-16 14327593 77.1 ns/op
Benchmark_antlabs_Timer_AddTimer/N-5m-16 16078015 80.0 ns/op
Benchmark_antlabs_Timer_AddTimer/N-10m-16 16101303 86.5 ns/op
Benchmark_RussellLuo_Timingwheel_AddTimer/N-1m-16 5994146 195 ns/op
Benchmark_RussellLuo_Timingwheel_AddTimer/N-5m-16 6636303 190 ns/op
Benchmark_RussellLuo_Timingwheel_AddTimer/N-10m-16 6803047 198 ns/op
Benchmark_ouqiang_Timewheel/N-1m-16 861498 1670 ns/op
Benchmark_ouqiang_Timewheel/N-5m-16 685520 1724 ns/op
Benchmark_ouqiang_Timewheel/N-10m-16 695408 1685 ns/op
Benchmark_Stdlib_AddTimer/N-1m-16 6622006 185 ns/op
Benchmark_Stdlib_AddTimer/N-5m-16 7021538 187 ns/op
Benchmark_Stdlib_AddTimer/N-10m-16 7219875 170 ns/op
PASS
ok benchmark 104.387s
vus520
2020-06-17 09:53:53 +08:00
@guonaihong 大神撸了好多包,也用了几个了。比较感兴趣的还是 curl,哈哈
guonaihong
2020-06-17 18:53:53 +08:00
@vus520 哦,哈哈。curl 库又加了很多选项支持。
guonaihong
2020-06-17 18:58:03 +08:00
@songjiaxin2008 5 级是对现实世界,ms, s, m, h, d 的近似值,比如一分钟等于 60s(60 刻度),为了方便方便位移操作选了 64(2 的 8 次方)的刻度。
ifconfig
2020-06-17 23:55:54 +08:00
正好目前在做的项目需要一个高性能定时器,支持一下楼主👍
guonaihong
2020-06-18 19:26:11 +08:00
@ifconfig 感谢支持。。。
tcfenix
2020-06-28 15:29:01 +08:00
楼主我记得你,上次你还发 deepcopy 库了
guonaihong
2020-06-29 10:53:05 +08:00
@tcfenix 哈哈,利害厉害,你记性好。
tcfenix
2020-06-29 11:10:16 +08:00
@guonaihong
现在 deepcopy 我还是用 coven,时间的话我开始改用你的库了
guonaihong
2020-06-30 10:44:20 +08:00

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

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

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

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

© 2021 V2EX