V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
guonaihong
V2EX  ›  Go 编程语言

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

  •  
  •   guonaihong ·
    guonaihong · 2020-06-16 10:28:00 +08:00 · 3741 次点击
    这是一个创建于 1619 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    
    
    16 条回复    2020-06-30 10:44:20 +08:00
    songjiaxin2008
        1
    songjiaxin2008  
       2020-06-16 10:36:19 +08:00
    好奇这个 5 级是怎么摸索出来的?经验值?
    wysnylc
        2
    wysnylc  
       2020-06-16 11:35:13 +08:00
    @songjiaxin2008 #1 新手村做完 3 个任务即可
    Vegetable
        3
    Vegetable  
       2020-06-16 11:38:29 +08:00
    想知道使用场景,有点懵逼,Golang 这样语言好像不是很适合这种场景呢
    sadfQED2
        4
    sadfQED2  
       2020-06-16 12:14:51 +08:00 via Android
    @Vegetable crontab 没法支持毫秒级定时任务,用这种框架搭一个定时任务服务器
    reus
        5
    reus  
       2020-06-16 13:49:57 +08:00
    1.13 比个屁,1.14 定时器有大改进
    guonaihong
        6
    guonaihong  
    OP
       2020-06-16 16:24:04 +08:00
    @reus 请看看下压测项目,有 go 1.14.4
    guonaihong
        7
    guonaihong  
    OP
       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
        8
    vus520  
       2020-06-17 09:53:53 +08:00
    @guonaihong 大神撸了好多包,也用了几个了。比较感兴趣的还是 curl,哈哈
    guonaihong
        9
    guonaihong  
    OP
       2020-06-17 18:53:53 +08:00
    @vus520 哦,哈哈。curl 库又加了很多选项支持。
    guonaihong
        10
    guonaihong  
    OP
       2020-06-17 18:58:03 +08:00
    @songjiaxin2008 5 级是对现实世界,ms, s, m, h, d 的近似值,比如一分钟等于 60s(60 刻度),为了方便方便位移操作选了 64(2 的 8 次方)的刻度。
    ifconfig
        11
    ifconfig  
       2020-06-17 23:55:54 +08:00
    正好目前在做的项目需要一个高性能定时器,支持一下楼主👍
    guonaihong
        12
    guonaihong  
    OP
       2020-06-18 19:26:11 +08:00
    @ifconfig 感谢支持。。。
    tcfenix
        13
    tcfenix  
       2020-06-28 15:29:01 +08:00
    楼主我记得你,上次你还发 deepcopy 库了
    guonaihong
        14
    guonaihong  
    OP
       2020-06-29 10:53:05 +08:00
    @tcfenix 哈哈,利害厉害,你记性好。
    tcfenix
        15
    tcfenix  
       2020-06-29 11:10:16 +08:00
    @guonaihong
    现在 deepcopy 我还是用 coven,时间的话我开始改用你的库了
    guonaihong
        16
    guonaihong  
    OP
       2020-06-30 10:44:20 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4650 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:07 · PVG 09:07 · LAX 17:07 · JFK 20:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.