深入探索Android卡顿优化(上)
(597条消息) 深入探索Android卡顿优化(上)_android 进程占用cpu时间过长_JsonChao的博客-CSDN博客
那么卡顿问题到底难在哪里呢?
1、卡顿产生的原因是错综复杂的,它涉及到代码、内存、绘制、IO、CPU等等。
2、线上的卡顿问题在线下是很难复现的,因为它与当时的场景是强相关的,比如说线上用户的磁盘IO空间不足了,它影响了磁盘IO的写入性能,所以导致卡顿。针对这种问题,我们最好在发现卡顿的时候尽量地去记录用户当时发生卡顿时的具体的场景信息。
2、卡顿分析方法之使用shell命令分析CPU耗时
尽管造成卡顿的原因有很多种,不过最终都会反映到CPU时间上。
CPU时间包含用户时间和系统时间。
用户时间:执行用户态应用程序代码所消耗的时间。
系统时间:执行内核态系统调用所消耗的时间,包括I/O、锁、中断和其它系统调用所消耗的时间。
CPU的问题大致可以分为以下三类:
1、CPU资源冗余使用
算法效率太低:明明可以遍历一次的却需要去遍历两次,主要出现在查找、排序、删除等环节。
没有使用cache:明明解码过一次的图片还去重复解码。
计算时使用的基本类型不对:明明使用int就足够,却要使用long,这会导致CPU的运算压力多出4倍。
2、CPU资源争抢
抢主线程的CPU资源:这是最常见的问题,并且在Android 6.0版本之前没有renderthread的时候,主线程的繁忙程度就决定了是否会引发用户的卡顿问题。
抢音视频的CPU资源:音视频编解码本身会消耗大量的CPU资源,并且其对于解码的速度是有硬性要求的,如果达不到就可能产生播放流畅度的问题。我们可以采取两种方式去优化:1、尽量排除非核心业务的消耗。2、优化自身的性能消耗,把CPU负载转化为GPU负载,如使用renderscript来处理视频中的影像信息。
大家平等,互相抢:比如在自定义的相册中,我开了20个线程做图片解码,那就是互相抢CPU了,结果就是会导致图片的显示速度非常慢。这简直就是三个和尚没水喝的典型案例。因此,在自定义线程池的时候我们需要按照系统核心数去控制线程数。
3、CPU资源利用率低
对于启动、界面切换、音视频编解码这些场景,为了保证其速度,我们需要去好好利用CPU。而导致无法充分利用CPU的因素,不仅有磁盘和网络I/O,还有锁操作、sleep等等。对于锁的优化,通常是尽可能地缩减锁的范围。
1、了解CPU 性能
————————————————
版权声明:本文为CSDN博主「JsonChao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_20798591/article/details/104259833