iOS检查界面是否卡顿,通常是监听
RunLoop
的状态,网上已经有大量的学习教程,这里就不详细描述了。
最近在学习C++,利用C++编写了一个检查应用卡顿工具类,暂时属于半完成品。
- 实现思路:开启一个子线程, 分别获取在主线程和子线程下获取时间,对比两个时间的差,是否超过
8
秒,超过则是耗时函数。
github:https://github.com/misaka14/WatchDog
部分代码
// 子线程开启GJiOSCheckWatchDog
static void GJiOSCheckWatchDog()
{
// 获取当前时间
uint64_t curr = GJiOSGetUpTime();
// 获取上一次主线程的时间
pthread_mutex_lock(&g_watchdog_lock);
uint64_t last_time = g_last_time;
pthread_mutex_unlock(&g_watchdog_lock);
// 说明已经开始警告了
if (last_time && (curr > last_time + WATCHDOG_ALARM))
{
// 打印堆栈信息
GJiOSAnrAlarmHandler(curr - last_time);
}
// 主线程更新一次时间
dispatch_async(dispatch_get_main_queue(), ^{
pthread_mutex_lock(&g_watchdog_lock);
g_last_time = GJiOSGetUpTime();
pthread_mutex_unlock(&g_watchdog_lock);
});
}