卡顿方案思考

回顾市面上大多数的开源监控方案,大多采用ANR这种机制下的做法去实现卡顿的监控,进而进行堆栈信息的追溯采集等。ANR这种方案最大的优点在于采集数据的准确率很高,基本可以说一旦发现主线程被block住了,那是一抓一个准的。但是同样也有着自己的缺陷,即ping的周期阈值的问题。 目前多数的做法是在子线程中周期性的ping主线程判断主线程是否被堵塞。如果不能在阈值内ping成功,说明主线程已经发生了卡顿 因此,此方案的问题在于这个ping周期应该是多长。本身在实现一套性能监控体系时,我们必须去衡量导入这个工具会带来怎样的损耗,因此这个周期不能太短。同样的,太长的周期也必然会漏掉可能发生的卡顿现象,而且这个概率不低。 平滑度 最近出现了一个称作平滑度的概念,通过应用使用前后的平滑...
Click to read more ...

GCD类型解密

GCD是一套强大的多线程方案,提供了多种任务队列来提高开发效率,通过阅读libdispatch的源码可以更好的理解GCD的工作流程,帮助我们设计更好的代码 结构类型 模板结构 libdispatch使用宏定义实现了大量的模板结构类型,除此之外还使用了union和enum结合的方式实现动态参数类型的灵活性: queue_type:队列类型,例如全局队列 source_type:资源统称,queue或者function都可以看做是一个资源 semaphore_type:信号类型,信号可以保证资源同时多线程竞争下的安全 continuation_type:派发任务会被封装成dispatch_continuation_t,然后被压入队列中 e...
Click to read more ...

资源使用

应用性能的衡量标准有很多,从用户的角度来看,卡顿是最明显的表现,但这不意味看起来不卡顿的应用就不存在性能问题。从开发角度来看,衡量一段代码或者说算法的标准包括空间复杂度和时间复杂度,分别对应内存和CPU两种重要的计算机硬件。只有外在与内在都做没问题,才能说应用的性能做好了。因此,一套应用性能监控系统对开发者的帮助是巨大的,它能帮助你找到应用的性能瓶颈。 CPU 线程是程序运行的最小单位,换句话来说就是:我们的应用其实是由多个运行在CPU上面的线程组合而成的。要想知道应用占用了CPU多少资源,其实就是获取应用所有线程占用CPU的使用量。结构体thread_basic_info封装了单个线程的基本信息: struct thread_basic_info { time_val...
Click to read more ...

多线程陷阱

随着手机硬件的升级,多线程技术在应用开发中的地位可以说足以媲美UITableView了。然而,多线程技术在提供我们生产力的同时,也不可避免的带来了陷阱,正如著名计算机学者所言:能力越大,bug越大 本文尝试从多个角度聊聊这些陷阱。 内存占用 线程的创建需要占用一定的内核物理内存以及CPU处理时间,具体消耗参见下表。 类型 消耗估算 详情 内核结构体 1KB 存储线程数据结构和属性 栈空间 子线程(512KB)Mac主线程(8MB)iOS主线程(1MB) $堆栈大小必须为4KB的倍数子线程的最小内存为1...
Click to read more ...

链式实现数据源

链式调用chained calls指在函数调用返回了一个对象的时候使得这个调用链可以不断的调用下去,从概念上可以看做是一环扣一环的铁链,也能被称作方法链调用。 假设需求是在网络请求完成之后先筛选过期数据,然后转换成对应的数据模型进行展示。在Swift中可以直接这么写: let dataArr = result["data"] as! [Dictionary] self.models = dataArr.filter{ $0["status"] == "1" }.map{ Model($0) } 而OC的语法决定了这步操作不能像Swift一样简洁,最常见的代码就是这样: NSArray * dataArr = result[@"data"]; NSMutableArray ...
Click to read more ...

GCD封装

移动设备上的应用性能取决于两个重要因素:硬件性能和软件质量。 硬件 通常来说,CPU的核心频率决定了设备的处理速度,频率越高,运行越快。在手机还是单核时代时,硬件对于运行性能的提升更为感官。相同时间内执行任务的数量取决于CPU处理频率 软件 软件取决于编写的代码质量,良好的代码设计能在相同的时间内完成更多的任务。在手机进入多核时代之后,能够实现真正的并行处理,这时候多线程对于应用性能的提升要比提升CPU频率要明显的多 多线程不是提升应用性能的万能药,过多的线程会造成线程切换的巨大开销。以最常用的GCD为例,多数开发者对于串行队列和并行队列的认识可能只停留在如何使用上,没有去了解过线程存在哪些开销。下表展示了创建一个线程...
Click to read more ...

YYKit学习笔记

YYKit是集大成者的第三方表现,堪称国内最优秀的框架。因此,在YYKit中有太多的技术点值得挖掘思考,本文用来记录YYKit源码阅读中的心得以及认为有价值的技术点 QoS The following Quality of Service (QoS) classifications are used to indicate to the system the nature and importance of work. They are used by the system to manage a variety of resources. Higher QoS classes receive more resources than lower ones during re...
Click to read more ...