0%

最近在做性能监控,思路大致是 hook 一些 cpu 耗时比较严重(layoutSubviews,cellForRow 等)的方法,获取方法调用的时间写入日志。后期对日志进行分析,得到优化的方向。

此文简单介绍一下整套系统的设计思路和简述实现细节。

设计原则

1.不能影响原有业务代码逻辑

我们只是一个观察者,不应该影响其他业务方正常的功能。

2.监控对性能影响尽可能小

显而易见,因为观察者效应,监控必然是会对原有性能有影响。这一点需要非常注意

3.最好不需要业务方书写代码

如果需要业务方自己书写代码,这一点非常麻烦。最好能做到无痕接入,尽可能通用、可配置。

*4.面对不同用户提供不同程度的能力

使用这套性能监控的人可能很多。

阅读全文 »

统计方法调用时间

最近在做性能监控,思路大致是 hook 一些 cpu 耗时比较严重(layoutSubviews,cellForRow 等)的方法,获取方法调用的时间写入日志。后期对日志进行分析,得到优化的方向。

因此写了一个类用于方便我们统计方法调用时长,这是所有统计的基础。

此文说一下一路走过来的坑

方案一:FowardInvocation

参考 JSPatch 的实现,把指定的方法都替换成 FowardInvocation,嵌入自己的统计时间代码,然后重新包装一次 NSInvocation 派发到原来的对象上。

阅读全文 »

简单猜测一下,如果有错误希望大家帮忙纠正。调用栈在最下面

1.准备

1.1 遍历了 layer 数组。并且调用了 _layoutEngine,发了一个 performPendingChangeNotifications

1.2 和 window 通讯

_applyInvocationsTo:window:
阅读全文 »

UITableView 刷新相关知识


UITableView 布局逻辑

阶段一:滑动或者其他的行为使得 tableView 被标记为脏

阶段二:脏 view 布局

阶段三:脏 view 递归询问子 view 更新


TableView 布局的内部实现

因为UIKit内部实现不可见,但是我们能够通过苹果相关文档的描述和调用栈的顺序猜测出内部大概的实现

阅读全文 »

统计 Cell 耗时

为了做性能监控,需要统计每个 view 的调用时间—— layout 是其中较耗时的行为。

如何统计时间

我们设想有这样一个 Cell 的层级关系

阅读全文 »