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

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

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


更多关于Golang Go语言 高性能定时器,基于 5 级时间轮实现。fast,fast,fast的实战教程也可以访问 https://www.itying.com/category-94-b0.html

17 回复

好奇这个 5 级是怎么摸索出来的?经验值?

更多关于Golang Go语言 高性能定时器,基于 5 级时间轮实现。fast,fast,fast的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


#1 新手村做完 3 个任务即可

想知道使用场景,有点懵逼,Golang 这样语言好像不是很适合这种场景呢

crontab 没法支持毫秒级定时任务,用这种框架搭一个定时任务服务器

1.13 比个屁,1.14 定时器有大改进

请看看下压测项目,有 go 1.14.4

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

大神撸了好多包,也用了几个了。比较感兴趣的还是 curl,哈哈

哦,哈哈。curl 库又加了很多选项支持。

5 级是对现实世界,ms, s, m, h, d 的近似值,比如一分钟等于 60s(60 刻度),为了方便方便位移操作选了 64(2 的 8 次方)的刻度。

正好目前在做的项目需要一个高性能定时器,支持一下楼主👍

感谢支持。。。

楼主我记得你,上次你还发 deepcopy 库了

哈哈,利害厉害,你记性好。


现在 deepcopy 我还是用 coven,时间的话我开始改用你的库了

在Go语言中实现高性能定时器,采用5级时间轮是一种非常有效的方法。时间轮算法通过将时间划分为多个槽位(bucket),每个槽位可以存放定时任务,从而实现对大量定时任务的高效管理。5级时间轮则进一步提升了这种效率,通过分层级管理不同粒度的定时器,减少了冲突和重定位的频率。

以下是5级时间轮实现高性能定时器的几个关键点:

  1. 层级设计:5级时间轮意味着有5个不同粒度的时间层级,从秒、分钟到小时、天甚至更长的时间跨度。每一级都管理着对应粒度的定时任务。

  2. 动态调整:时间轮算法支持动态添加和删除定时任务,这在高并发环境下尤为重要。通过合理的槽位分配和回收策略,可以确保定时任务的及时执行和资源的高效利用。

  3. 减少冲突:5级时间轮的层级设计有效减少了定时任务在同一时间点的冲突,使得每个任务都能被准确地调度和执行。

  4. 内存优化:通过时间轮的循环使用和槽位的复用,避免了大量内存分配和回收的开销,进一步提升了性能。

综上所述,基于5级时间轮实现的Go语言高性能定时器,能够在保证高效执行的同时,支持大量定时任务的动态管理。这种设计不仅提升了系统的响应速度和稳定性,还降低了资源消耗,是构建高性能分布式系统的重要基石。在追求“fast, fast, fast”的IT环境中,这种定时器实现方案无疑具有极大的优势和吸引力。

回到顶部