GCD Timer事件的精度
一、测试环境
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事件的精度的更多相关文章
- 从NSTimer的失效性谈起(二):关于GCD Timer和libdispatch
一.GCD Timer的创建和安放 尽管GCD Timer并不依赖于NSRunLoop,可是有没有可能在某种情况下,GCD Timer也失效了?就好比一開始我们也不知道NSTimer相应着一个runl ...
- 第27月第6天 gcd timer
1.gcd timer 因为如果不用GCD,编码需要注意以下三个细节: 1.必须保证有一个活跃的runloop. performSelector和scheduledTimerWithTimeInter ...
- gcd timer
//0.创建队列 dispatch_queue_t queue = dispatch_get_global_queue(, ); NSLog(@"%s",__func__); // ...
- windows获取时间的方法
介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执 行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如我们通过记录 ...
- 时间的函数,sleep,clock,gettickcount,QueryPerformanceCounter(转)
介绍 我 们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都 会用到时间函数.还比如我们通过记录函数或者算 ...
- windows时间函数
介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执 行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如我们通过记 ...
- VC++程序运行时间测试函数
0:介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如我们通过记录函数或者算 ...
- 【转】【VC】VC程序运行时间测试函数
1:Sleep函数 使用: sleep(1000),在Windows和Linux下1000代表的含义并不相同,Windows下的表示1000毫秒,也就是1秒钟: Linux下表示1000秒,Linux ...
- VC程序运行时间测试函数
VC程序运行时间测试函数 介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如 ...
- Winform Timer用法,Invoke在Timer的事件中更新控件状态
System.Timers.Timer可以定时执行方法,在指定的时间间隔之后执行事件. form窗体上放一个菜单,用于开始或者结束定时器Timer. 一个文本框,显示定时执行方法. public pa ...
随机推荐
- 润乾报表与 ActiveReport JS 功能对比
简介 润乾报表是用于报表制作的大型企业级报表软件,核心特点在于开创性地提出了非线性报表数学模型,采用了革命性的多源关联分片.不规则分组.自由格间运算.行列对称等技术,使得复杂报表的设计简单化,以往难以 ...
- leetcode每日一题:836. 矩形重叠
836. 矩形重叠 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的 ...
- 《Effective C#》系列之(六)——提高多线程的性能
一.综述 <Effective C#>中提高多线程性能的方法主要有以下几点: 避免锁竞争:锁的使用会导致线程阻塞,从而影响程序的性能.为了避免锁竞争,可以采用无锁编程技术,如CAS(Com ...
- 力扣453(java)-最小操作次数使数组元素相等(简单)
题目: 给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 .返回让数组所有元素相等的最小操作次数. 示例 1: 输入:nums = [1,2,3]输出:3解释:只需要3次操作 ...
- 牛客网-SQL专项训练7
①SQL语言可以分为多个类别,那么不属于数据操纵语言DML的是(B) 解析: SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语 ...
- 云原生时代 RocketMQ 运维管控的利器 - RocketMQ Operator
作者 | 刘睿.杜恒 导读:RocketMQ Operator 现已加入 OperatorHub,正式进入 Operator 社区.本文将从实践出发,结合案例来说明,如何通过 RocketMQ Ope ...
- 阿里云重磅发布业务中台产品 BizWorks,中台发展进入下一个阶段
简介: 业务中台产品BizWorks重磅发布,这可以看作是阿里云在 "做厚中台" 战略上继 "云钉一体"之后的又一个新动作! 10 月 19 日,2021 云 ...
- coredump 瘦身风云
简介: minicoredump神也! 继上一篇非典型程序员青囊搞定内存泄露问题后,美美地睡了一觉.睡梦中,突然金光闪闪,万道光芒照进时光隧道,恍惚来到大唐神龙年间.青囊此时化身狄仁杰高级助理, ...
- 基于 MaxCompute + Hologres 的人群圈选和数据服务实践
简介: 本文主要介绍如何通过 MaxCompute 进行海量人群的标签加工,通过 Hologres 进行分析建模,从而支持大规模人群复杂圈选场景下的交互式体验,以及基于API的数据服务最佳实践. 本 ...
- Fast Walsh Transform 学习笔记 | FWT
本文中使用 \(\cap\) 表示按位与,用 \(\cup\) 表示按位或 Part 1. 与/或 卷积 First. 问题引入 给定长度为 \(2^n\) 的数列 \(A,B\),求 \(C_i = ...