这一篇文章系统的梳理主流定时器算法实现的差异以及应用地方。

  1. 定时器介绍

程序里的定时器主要实现的功能是在未来的某个时间点执行相应的逻辑。在定时器模型中,一般有如下几个定义。

interval:间隔时间,即定时器需要在interval时间后执行

StartTimer:添加一个定时器任务

StopTimer:结束一个定时器任务

PerTickBookkeeping: 检查定时器系统中,是否有定时器实例已经到期,相当于定义了最小时间粒度。

常见的实现方法有如下几种:

链表

排序链表

最小堆

时间轮

接下来我们一起看下这些方法的具体实现原理。

  1. 定时器实现方法

2.1 链表实现

链表的实现方法比较粗糙。链表用于存储所有的定时器,每个定时器都含有interval 和 elapse 两个时间参数,elapse表示当前被tickTimer了多少次。当elapse 和interval相等时,表示定时器到期。

在此方案中,添加定时器就是在链表的末尾新增一个节点,时间复杂度是 O(1)。如果想要删除一个定时器的话,我们需要遍历链表找到对应的定时器,时间复杂度是O(n)。此方案下,每隔elapse时间,系统调用信号进行超时检查,即PerTickBookkeeping。每次PerTickBookkeeping需要对链表所有定时器进行 elapse++,因此可以看出PerTickBookkeeping的时间复杂度是O(N)。可以看出此方案过于粗暴,所以使用场景极少

2.2 排序双向链表实现

排序双向链表是在链表实现上的优化。优化思路是降低时间复杂度。

首先,每次PerTickBookkeeping需要自增所有定时器的elapse变量,如果我们将interval变为绝对时间,那么我们只需要比较当前时间和interval时间是否相等,减少了对每个定时器的操作。如果不需要对每个定时器进行操作,我们将定时器进行排序,那么每次PerTickBookkeeping都只需要判断第一个定时器,时间复杂度为O(1)。相应的,为了维持链表顺序,每次新增定时器需要进行链表排序时间复杂度为 O(N)。每次删除定时器时,由于会持有自己节点的引用,所以不需要查找其在链表中所在的位置,所以时间复杂度为O(1),双向链表的好处。
图1 双向链表实现示意图

2.3 时间轮实现

时间轮示意图如下:
图2 时间轮

时间轮的数据结构是数组 + 链表。 他的时间轮为数组,新增和删除一个任务,时间复杂度都是O(1)。PerTickBookkeeping每次转动一格,时间复杂度也是O(1)。

2.4 最小堆实现

最小堆是堆的一种, (堆是一种二叉树), 指的是堆中任何一个父节点都小于子节点, 子节点顺序不作要求。

二叉排序树(BST)指的是: 左子树节点小于父节点, 右子树节点大于父节点, 对所有节点适用
图3 最小堆

树的基本操作是插入节点和删除节点。对最小堆而言,为了将一个元素X插入最小堆,我们可以在树的下一个空闲位置创建一个空穴。如果X可以放在空穴中而不被破坏堆的序,则插入完成。否则就执行上滤操作,即交换空穴和它的父节点上的元素。不断执行上述过程,直到X可以被放入空穴,则插入操作完成。因此我们可以知道最小堆的插入时间复杂度是O(lgN)。最小堆的删除和插入逻辑基本类似,如果不做优化,时间复杂度也是O(lgN),但是实际实现方案上,做了延迟删除操作,时间复杂度为O(1)。

延迟删除即设置定时器的执行回调函数为空,每次最小堆超时,将触发pop_heap,pop会重新调整最小堆,最终删除的定时器将调整到堆顶,但是回调函数不处理。

可以看到PerTickBookkeeping只处理堆顶定时器,时间复杂度O(1)。最小堆可以使用数组来进行表示,数组中,当前下标n的左子节点为2N + 1,当前下标n的右子节点小标为2N + 2。
图4 最小堆的数组表示

  1. 定时器不同实现对比

3.1 时间复杂度对比
图5 不同实现时间复杂度

从上面的介绍来看,时间轮的时间复杂度最小、性能最好。

3.2 使用场景来看

在任务量小的场景下:最小堆实现,可以根据堆顶设置超时时间,数组存储结构,节省内存消耗,使用最小堆可以得到比较好的效果。而时间轮定时器,由于需要维护一个线程用来拨动指针,且需要开辟一个bucket数组,消耗内存大,使用时间轮会较为浪费资源。在任务量大的场景下:最小堆的插入复杂度是O(lgN), 相比时间轮O(1) 会造成性能下降。更适合使用时间轮实现。在业界,服务治理的心跳检测等功能需要维护大量的链接心跳,因此时间轮是首选。

更多免费技术资料及视频

系统梳理主流定时器算法实现的差异以及应用相关推荐

  1. 采样算法哪家强?一个针对主流采样算法的比较

    论文标题: A Systematic Characterization of Sampling Algorithms for Open-ended Language Generation 论文作者: ...

  2. 推荐系统[二]:召回算法超详细讲解[召回模型演化过程、召回模型主流常见算法(DeepMF/TDM/Airbnb Embedding/Item2vec等)、召回路径简介、多路召回融合]

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排).系统架构.常见问题.算法项目实战总结.技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排 ...

  3. 船舶和计算机结合论文格式,近海船舶监控系统中航迹关联算法的计算机研究与实现...

    本文是一篇计算机论文,本文是在阅读了国内外大量关于航迹关联算法的文献的基础上提出了一种基于区域划分的航迹关联算法.并参考了大量主流的船舶监控软件系统,设计实现了近海船舶原型系统,并将算法完成应用实现. ...

  4. 视频会议系统的主流解决方案与技术趋势

    视频会议系统的主流解决方案与技术趋势 类型:转载 作者: 最后更新:2005-5-2 10:11:39 推荐指数: 12050 视频会议系统传输的是多媒体数据,声音和动态图像的源信号的数据量较大,无法 ...

  5. 一文带你系统梳理Google三驾马车

    一文带你系统梳理Google三驾马车 不知道大家在工作中,有没有遇到过这类程序员:他们无论在什么岗位,开发什么系统,好像都能够抓到问题的本质,做得「游刃有余」. 我也经常碰到这类程序员,每次我向他们请 ...

  6. R语言plotly可视化:plotly可视化箱图、相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数、linear、inclusive、exclusive)

    R语言plotly可视化:plotly可视化箱图.相同数据集对比使用不同分位数算法的可视化差异(quartilemethod参数.linear.inclusive.exclusive) 目录

  7. 微服务后如何做一次系统梳理

    2019独角兽企业重金招聘Python工程师标准>>> 微服务的主要目的是将原本独立的系统拆分成多个小的,有独自进程运行的,同时这些小的服务单元之间通过RPC或者HTTP协议来相互通 ...

  8. STM32系统滴答定时器(systick)应用

    一:系统滴答定时器(systick) 1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断).滴答中断?这里来 ...

  9. stm32系统滴答定时器使用

     STM32菜鸟成长记录---系统滴答定时器(systick)应用 标签: delay任务测试reference编译器工作 2012-08-19 22:55 47395人阅读 评论(4) 收藏 举 ...

最新文章

  1. 计算机系统存数及取数方式,计算机系统结构总结2
  2. Dubbo入门(一)
  3. C语言嵌入式系统编程修炼之道——屏幕操作篇
  4. sqlserver生成脚本
  5. STIMULUS(二) —— Hello, Stimulus
  6. 索引体积_MySQL入门之索引
  7. 【Flink】flink ClickHouseSink--数据写入ClickHouse
  8. HDMI、DVI和VGA接口互相转换问题
  9. php 生成类,PHP静态文件生成类实例
  10. 前端架构最全总结——GUI 应用程序架构的十年变迁:MVC、MVP、MVVM、Unidirectional、Clean...
  11. 数字电子技术基础一览
  12. 1. 喵喵宠物管理系统需求分析
  13. c++ 写并查集算法模板
  14. 百度推出新版团购导航 对团购导航造成冲击
  15. Win7快速启动栏恢复方法
  16. 采用Pyinstaller将python程序打包成exe可执行程序
  17. 配置局域网内电脑快速传输数据
  18. Web安全学习day01
  19. getElementById()和$(#id)的区别
  20. 超超经典语录、看的我心拔凉拔凉的、我真的hold不住!!

热门文章

  1. 致迷茫的程序员一封信——我的程序生涯
  2. ElasticSearch、kibana、ik、pinyin下载安装
  3. Java基础之---- 集合(一)List
  4. 机器学习——时间序列ARIMA模型(一):差分法详解
  5. 欢迎中国电信股份有限公司云计算分公司加入openGauss社区
  6. 苏州大学计算机学院翟洁,吴宏杰
  7. 第二周【项目1-旱冰场造价】
  8. logback打印日志不显示具体的信息,显示问号
  9. 视频美颜SDK拍摄类APP近况报告
  10. 友盟分享微信提示文字弹出两次