GCD Timer事件的精度
一、测试环境
iPhoneX 真机+Debug模式,Timer代码工作在主线程,主线程空闲不阻塞
在子线程统计每3秒tick计数,逐步减小inteval,看能达到多大精度。
忽略原子计数值操作的影响
二、测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | @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,对应结果如下;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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级别精度
分类:
IOS开发问题积累
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架