CPU 问题无非分为以下三类:
CPU 资源冗余使用
关于这个问题,可以是算法太糙,明明可以遍历一次的却遍历两次,主要出现在查找、排序、删除等环节;也可以是没有 cache ,明明解码过一次的图片还重复解码。还有,明明使用 int 就足够,偏偏
要用 long ,导致 CPU 的运算压力多出 4 倍。
CPU 资源争抢
资源争抢也有几种经典情况。
( 1 )抢主线程的 CPU 资源。这是最常见的问题,关键是主线程起码在 Android
Handler 优化。
6.0 版之前,没有 renderthread 的时候,其繁忙程度就决定了是否会引发用户的卡顿问题。最经典的例子就是主线程的
( 2 )抢音视频的 CPU 资源。跟主线程的情况不同,音视频编解码本身就消耗了大量的 CPU 资源,同时音视频编解码对于解码的速度是有硬要求的,达不到就会有产生播放流畅度的问题,试想下,听
歌的时候总卡,是不是很难受。所以最常见的一种情况就是 CPU 满负载,除了在耗电上有非常恶劣的影响外,还会让音视频没有足够的资源保持流畅播放。怎么办?通过两点挪走压垮骆驼的稻草:第
一、排除非核心业务的消耗,如下面说的 QQ 音乐的案例,还有贴耳检测的频率控制;第二、优化自身的性能消耗,把 CPU 负载转化为 GPU 负载,最经典的就是利用 renderscript 来处理视频中的影像信息。
( 3 )大家平等,相互抢。前面两点都有主次之分,强弱之别,但是如果是 QQ 相册,我开了 20 个线程做图片解码,那就是相互抢,我们曾经就遇到过这样的问题,效果就是导致图片的显示速度非常
慢。这简直就是三个和尚没水喝的典型案例。因此按照核心数、控制线程数还是很有道理的。
CPU 资源利用率低
CPU 就是速度与负载的博弈,用得多会耗电、会卡顿,用得少也会有问题,像启动、界面切换、音视频编解码这些场景,为了保证其速度,不好好利用 CPU ,真对不起核心数的不断飙升。而导致无
法充分利用 CPU 的因素,除了前面说的磁盘和网络 I/O 外,还有锁操作、 sleep 等。其中锁的优化,一般在锁的范围上,主要是尽可能地缩减范围
1 . TOP 软件
TOP 软件大家应该是非常熟悉的了,依靠 adb shell top 就可以简单地列出进程的各种信息。缺点就是 TOP 本身的性能消耗就不少,所以我们在自动化测试里面的取值,一般不用 TOP 。下面举几个 TOP 的
小例子,如图 4-1 所示。
( 1 )排除 0 %的进程信息: adb shell top | grep -v ' 0 % S ' 。
( 2 )只打印 1 次按 CPU 排序的 TOP 10 的进程信息: adb shell top -m 10 -s cpu -n 1 。
( 3 )指定进程的 CPU 、内存等消耗,并设置刷新间隔: adb shell top -d 1 | grep com.tencent.mobileqq 。
2 . PS 软件
adb shell ps -p -t -P -x -c [ PID ]的例子,即用 PS 软件来形象地处理进程的身份标识,如图 4-2 所示。
3 . proc 下的 CPU 信息
cat /proc/ [ pid ] /stat ,如图 4-3 所示。
下面只重点介绍图 4-3 中几个关键数值的含义:
pid 进程号
tcomm 执行程序
state 进程状态
ppid 父进程号
pgrp pgrp of the process
sid session id
tty_nr tty the process uses
tty_pgrp pgrp of the tty
flags task flagsmin_flt number of minor faults
cmin_flt number of minor faults with child's
maj_flt number of major faults
cmaj_flt number of major faults with child's
utime 用户态 CPU 消耗( user mode jiffi es )
stime 内核态 CPU 消耗( kernel mode jiffi es )
cutime 子进程用户态 CPU 消耗( user mode jiffi es with child's )
cstime 子进程内核态 CPU 消耗( kernel mode jiffi es with child's )
4 . dumpsys cpuinfo
通过执行 adb shell dumpsys cpuinfo 可以获取比起 TOP 更加简活精练的信息
5 . Systrace 、 Traceview 与 Trepn
这些工具都跟 CPU 相关。 Systrace 和 Trace View 作为定位工具,而 Trepn 会作为耗电的分析工具
Traceview已被弃用。如果您使用的是Android Studio 3.2或更高版本,您应该使用CPU Profiler来检查通过Debug类对您的应用程序进行插桩所捕获的.trace文件,记录新的方法跟踪,保存.trace文件,并检查应用程序进程的实时CPU使用情况。
https://developer.android.com/studio/profile/traceview
https://developer.android.com/studio/profile/cpu-profiler
android List的removeAll,找需要删除的ITEM要遍历一次,删除又遍历一次.影响性能