性能监控、耗电优化

2020-05-08  本文已影响0人  zhouluyao

线上性能监控,主要集中在 CPU 使用率、帧率和内存这三个方面。

CPU使用率

App 作为进程运行起来后会有多个线程,每个线程对 CPU 的使用率不同。各个线程对 CPU 使用率的总和,就是当前 App 对 CPU 的使用率。

因为每个线程都会有这个 thread_basic_info 结构体,所以接下来的事情就好办了,你只需要定时(比如,将定时间隔设置为 2s)去遍历每个线程,累加每个线程的 cpu_usage 字段的值,就能够得到当前 App 所在进程的 CPU 使用率了。我们累加这个字段就能够获取到当前的整体 CPU 使用率。

FPS监控

1、对 FPS 的监控也可以比较简单的实现:通过注册 CADisplayLink 得到屏幕的同步刷新率,记录每次刷新时间,然后就可以得到 FPS。

2、开始渲染时间与上次渲染时间差值 NSTimeInterval useTime = self.dLink.timestamp - lastTimeStamp;

- (void)start {
    self.dLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(fpsCount:)];
    [self.dLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
}

// 方法执行帧率和屏幕刷新率保持一致
- (void)fpsCount:(CADisplayLink *)displayLink {
    if (lastTimeStamp == 0) {
        lastTimeStamp = self.dLink.timestamp;
    } else {
        total++;
        // 开始渲染时间与上次渲染时间差值
        NSTimeInterval useTime = self.dLink.timestamp - lastTimeStamp;
        if (useTime < 1) return;
        lastTimeStamp = self.dLink.timestamp;
        // fps 计算
        fps = total / useTime; 
        total = 0;
    }
}

内存使用率

我们只要从这个结构体里取出 phys_footprint 字段的值,就能够监控到实际物理内存的使用情况了
uint64_t memoryUsage() {
    task_vm_info_data_t vmInfo;
    mach_msg_type_number_t count = TASK_VM_INFO_COUNT;
    kern_return_t result = task_info(mach_task_self(), TASK_VM_INFO, (task_info_t) &vmInfo, &count);
    if (result != KERN_SUCCESS)
        return 0;
    return vmInfo.phys_footprint;
}

耗电优化

判断哪个线程CPU使用率高

我们还是先反过来看看出现电量问题的期间,哪个线程是有问题的。

通过这种方法,你就可以快速定位到问题,有针对性地进行代码优化。遍历线程中的threadBaseInfo->cpu_usage字段,大于临界值比如900的打印出调用堆栈.

I/O 操作要怎么优化

业内的普遍做法是,将碎片化的数据磁盘存储操作延后,先在内存中聚合,然后再进行磁盘存储。碎片化的数据进行聚合,在内存中进行存储的机制,可以使用系统自带的 NSCache 来完成。

每次读取图片时,会检查 NSCache 是否已经存在图片数据:如果有,就直接从 NSCache 里读取;如果没有,才会通过 I/O 读取磁盘缓存图片。

性能优化:

影响发热耗电的因素总结:

1、CPU使用率:CPU的功耗是各个元器件最高的,是引发耗电的首要因素

2、网络流量:信号较好时,wifi和4g的耗电量差不多的,WiFi信号较差时,4g的耗电量可达WiFi的12倍

3、GPS:GPS定位模块也是耗电大户,持续使用GPS定位1分钟可引起系统发热

4、IO总量:IO设置频繁使用一定程度上会增加系统耗电

5、屏幕亮度最亮是平度亮度(0.3)耗电的4倍

监控方案总结:

1、流量控制:在信令通道和HTTP通道建立统一的监控机制,记录各业务流量

2、GPS监控:GPS模块的权限统一管理,记录各个业务使用时长

3、CPU监控:CPU使用超过阈值时通过定时抓取线程堆栈辅助分析

上一篇下一篇

猜你喜欢

热点阅读