一、测试环境

  iPhoneX 真机+Debug模式,Timer代码工作在主线程,主线程空闲不阻塞

  在子线程统计每3秒tick计数,逐步减小inteval,看能达到多大精度。

  忽略原子计数值操作的影响 

二、测试代码

  

@interface ViewController ()

@property (nonatomic, strong)   dispatch_source_t timer;
@property (atomic, assign) NSInteger count;
@property (nonatomic, strong) NSDate *startDate; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self testTimer];
[self dumpResult];
} - (void)setupTimer
{
_startDate = [NSDate date]; _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue()); dispatch_source_set_timer(_timer,
dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC),
10 * NSEC_PER_USEC,
0); dispatch_source_set_event_handler(_timer, ^{
self.count++;
});
dispatch_resume(_timer);
} - (void)dumpResult
{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
while (YES) {
[NSThread sleepForTimeInterval:3];
NSLog(@"%lf per second", self->_count * 1.0 / [[NSDate date] timeIntervalSinceDate:_startDate] );
self.count = 0;
_startDate = [NSDate date];
}
});
} - (void)testTimer
{
[self setupTimer];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

  

  间隔分别设置为1000us,100us,10us,对应结果如下;

  

2018-08-21 20:18:59.344851+0800 TestGCDTimer[17447:7933588] 664.509536 per second
2018-08-21 20:19:02.345519+0800 TestGCDTimer[17447:7933588] 998.187963 per second
2018-08-21 20:19:05.347805+0800 TestGCDTimer[17447:7933588] 999.964033 per second
2018-08-21 20:19:08.353024+0800 TestGCDTimer[17447:7933588] 999.657229 per second
2018-08-21 20:19:11.354784+0800 TestGCDTimer[17447:7933588] 999.810779 per second
2018-08-21 20:19:14.355783+0800 TestGCDTimer[17447:7933588] 999.763704 per second
2018-08-21 20:19:17.359697+0800 TestGCDTimer[17447:7933588] 1000.090226 per second
2018-08-21 20:19:20.364868+0800 TestGCDTimer[17447:7933588] 999.988378 per second
2018-08-21 20:19:23.370107+0800 TestGCDTimer[17447:7933588] 999.985720 per second
2018-08-21 20:19:26.374239+0800 TestGCDTimer[17447:7933588] 1000.022002 per second
2018-08-21 20:19:29.375823+0800 TestGCDTimer[17447:7933588] 999.875706 per second 2018-08-21 20:19:47.485125+0800 TestGCDTimer[17450:7934123] 6615.815753 per second
2018-08-21 20:19:50.486199+0800 TestGCDTimer[17450:7934123] 9991.399568 per second
2018-08-21 20:19:53.490001+0800 TestGCDTimer[17450:7934123] 9994.962862 per second
2018-08-21 20:19:56.490189+0800 TestGCDTimer[17450:7934123] 9996.189939 per second
2018-08-21 20:19:59.490784+0800 TestGCDTimer[17450:7934123] 9994.127387 per second
2018-08-21 20:20:02.492282+0800 TestGCDTimer[17450:7934123] 9988.322134 per second
2018-08-21 20:20:05.495670+0800 TestGCDTimer[17450:7934123] 9997.735664 per second
2018-08-21 20:20:08.495762+0800 TestGCDTimer[17450:7934123] 9993.233265 per second
2018-08-21 20:20:11.496856+0800 TestGCDTimer[17450:7934123] 9994.565064 per second
2018-08-21 20:20:14.498354+0800 TestGCDTimer[17450:7934123] 9997.541106 per second 2018-08-21 20:20:56.694542+0800 TestGCDTimer[17454:7934900] 23341.699400 per second
2018-08-21 20:20:59.696130+0800 TestGCDTimer[17454:7934900] 33664.868549 per second
2018-08-21 20:21:02.697670+0800 TestGCDTimer[17454:7934900] 31380.877279 per second
2018-08-21 20:21:05.699141+0800 TestGCDTimer[17454:7934900] 34535.414907 per second
2018-08-21 20:21:08.700716+0800 TestGCDTimer[17454:7934900] 34488.215922 per second
2018-08-21 20:21:11.702206+0800 TestGCDTimer[17454:7934900] 34440.995680 per second
2018-08-21 20:21:14.703723+0800 TestGCDTimer[17454:7934900] 34449.645662 per second

  

三、结论

  GCD Timer 最大精度 0.03ms左右。完全可以达到ms级别精度

GCD Timer事件的精度的更多相关文章

  1. 从NSTimer的失效性谈起(二):关于GCD Timer和libdispatch

    一.GCD Timer的创建和安放 尽管GCD Timer并不依赖于NSRunLoop,可是有没有可能在某种情况下,GCD Timer也失效了?就好比一開始我们也不知道NSTimer相应着一个runl ...

  2. 第27月第6天 gcd timer

    1.gcd timer 因为如果不用GCD,编码需要注意以下三个细节: 1.必须保证有一个活跃的runloop. performSelector和scheduledTimerWithTimeInter ...

  3. gcd timer

    //0.创建队列 dispatch_queue_t queue = dispatch_get_global_queue(, ); NSLog(@"%s",__func__); // ...

  4. windows获取时间的方法

    介绍       我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执 行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如我们通过记录 ...

  5. 时间的函数,sleep,clock,gettickcount,QueryPerformanceCounter(转)

    介绍 我 们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都 会用到时间函数.还比如我们通过记录函数或者算 ...

  6. windows时间函数

    介绍        我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执 行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如我们通过记 ...

  7. VC++程序运行时间测试函数

    0:介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如我们通过记录函数或者算 ...

  8. 【转】【VC】VC程序运行时间测试函数

    1:Sleep函数 使用: sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟: Linux下表示1000秒,Linux ...

  9. VC程序运行时间测试函数

    VC程序运行时间测试函数 介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如 ...

  10. Winform Timer用法,Invoke在Timer的事件中更新控件状态

    System.Timers.Timer可以定时执行方法,在指定的时间间隔之后执行事件. form窗体上放一个菜单,用于开始或者结束定时器Timer. 一个文本框,显示定时执行方法. public pa ...

随机推荐

  1. 认识tensorflow - 【老鱼学tensorflow2】

    深度学习是模仿了生物的神经元的概念,你可以想象用一大堆的神经元通过各种刺激来对外部世界进行感知,从而建立起对外部世界的模型. 比如给你一个数据对: x y -1 -3 0 -1 1 1 2 3 3 5 ...

  2. State 和 Props的理解以及区别

    一.state 一个组件的显示形态可以由数据状态和外部参数所决定,而数据状态就是state,一般在 constructor 中初始化 当需要修改里面的值的状态需要通过调用setState来改变,从而达 ...

  3. Crazy Excel:Excel中的泥石流

    Crazy Excel又名:疯狂Excel.是一款PC端的Excel软件工具,该软件支持windows, mac os等主流操作系统. 正如其名,作者在设计之初就加入了一些疯狂的设计,目的是创作出更加 ...

  4. 报错ORA-01830: date format picture ends before converting entire input string

    报错ORA-01830: date format picture ends before converting entire input string 原语句 select to_char(to_da ...

  5. 【笔记】Oracle 窗口函数

    Oracle 窗口函数 简单来说,窗口函数是分析函数的一种,通常可以理解成over()函数 构成:函数名①() over(partition by 分组的列名 order by 排序的列名 XXX) ...

  6. 高德AR驾车导航解决方案

    简介: 高德从2018年首创了车载AR导航后,已经先后在后视镜.智能车盒.前装整车厂.后装车机产品.行车记录仪等众多场景落地应用,搭建了非常完整的AR导航生态. 日前,高德地图最新发布了v10.60新 ...

  7. IT人的年夜饭,也太香了吧

    ​简介: 平时的IT人,奋战在修复bug前线,起早与贪黑齐飞,调休共假期待定.到了新春佳节,对于IT人来说,没有什么是比一顿年夜饭更让人熨贴肺腑的了.为了让废寝忘食编程序.闻机起早保运维的IT人过一个 ...

  8. Echarts立体地图加3D柱图可点击可高亮选中的开发

    注意 echarts请使用v5.1.0以上版本,低版本会无法显示,或者无法触发点击事件. 若有闪屏bug,不要设置temporalSuperSampling属性. 注意图层顺序. 实现原理 借助 ec ...

  9. Ubuntu WSL 下编译并使用OpenJDK12

    一,安装Ubuntu WSL 1.Windows中设置WSL并安装Ubuntu wsl "控制面板"-->"程序"-->"启用或关闭Win ...

  10. 2.docker-compose安装prometheus

    一.docker-compose安装 前期准备 # docker配置文件 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json < ...