You need to enable JavaScript to run this app.
最新活动
产品
解决方案
定价
合作与生态
支持与服务
开发者
了解我们
导航

性能测评

更新时间:2023.01.31 10:13:35

进行性能测评时推荐细分业务场景,比如核心页面、Feed流的滑动、App的启动1分钟内的操作场景等。因为资源消耗和使用场景密切关联,通常无法约定统一标准。

使用场景

  • 掌握App的运行时的资源消耗情况,作为准出标准,并为性能优化提供依据。
  • 在具体的资源方面,重点考虑以下情形。
    • 判断是否发生内存泄漏

    • 判断是否存在明显卡顿

    • 判断相比上一版本,内存、CPU、FPS指标是否发生劣化

Android

Android提供了CPU、卡顿和内存的指标,后续将增加功耗、流量以及IO等。

CPU使用率

App监控提供了4个CPU使用率来衡量CPU的消耗,推荐使用规范化的App CPU使用率来作为应用的测评标准。

  • 整机CPU使用率
    整机CPU使用率用于衡量设备的负载情况。数值越大,表明当前手机任务越繁忙。
    计算原理:
    CPU执行时间片 = A时刻的CPU(总时间片 - Idle状态时间片) - B时刻的CPU(总时间片 - Idle状态时间片)
    总时间片 = A 时刻的CPU总时间片 - B时刻的CPU总时间片
    CPU使用率 = CPU执行时间片/总时间片
    CPU的时间片可以通过cat /proc/stat获取。

  • App CPU使用率
    App CPU使用率用于衡量App对CPU的使用情况。
    计算原理和计算方式和系统CPU使用率计算相似,使用指定进程的时间片,通过cat /proc/pid/stat获取。
    规范化使用率:参考腾讯的指标设计,增加了这一指标。即考虑到手机cpu频率是变化的,用传统cpu使用率计算方法,在低频率时刻计算出cpu使用率=30%,和在cpu高频时刻计算出cpu使用率=30%。同样都是30%但性能消耗显然后者更高。
    计算原理:
    规范化使用率 = 上述计算的CPU使用率 * (当前所有CPU频率之和/所有CPU频率最大值之和)

CPU核使用率

类似于CPU使用率,这里增加了分别对每一个核的计算。可以综合考量当前CPU的调度和使用情况。

CPU频率指标

提供每个核的频率变化曲线,可以用来考量CPU的调度情况。

FPS

针对流畅性,一共提供了8个参考指标。

指标解释
FPS数据获取时间周期内,实际渲染帧数/ 数据获取间隔时间。
Jank单帧绘制耗时> MOVIE_FRAME_TIME 时,计一次jank。
BigJank单帧绘制耗时> 3 * MOVIE_FRAME_TIME 时,计一次big jank。
Stutter卡顿比。当发生jank的帧的累计时长与区间时长的比值。

其中,MOVIE_FRAME_TIME即一帧电影的耗时,一般电影是24帧每秒,所以
MOVIE_FRAME_TIME = 1000 / 24

简单情况下,推荐使用FPS来衡量页面综合流畅度,重点关注BigJank的发生场景。

内存

内存总览:系统角度看App(进程)的内存占用

指标说明

TotalPSS

Proportional Set Size 实际使用的物理内存(按比例分配共享库占用的内存)
即进程实际占有内存(不含分配但未使用的内存)+按比例分配的共享库内存。

VMSize

虚拟内存大小。
32位CPU架构可使用的地址空间大小为2^32=4GB,其中高位部分为内核空间。一个32位的应用,它基于32位的zygote fork得来,Linux进程在fork时会继承父进程所有虚拟地址空间,因此在一个应用出生时,它的虚拟内存空间基本就在1.8G以上。

  • 32位应用 + 32位设备:内核空间占用1G地址空间,应用可用虚拟地址上限为3G - 1.8G = 1.2G。
  • 32位应用 + 64位设备:内核运行在64位,应用可用虚拟地址上限为4G - 1.8G = 2.2G。
    64位CPU + 64位应用基本可以认为虚拟空间是足够的。但仍然要关注不合理占用。
VMSwapVM交换区
Available可用内存

当App发生非Java OOM的时候,大部分是因为虚拟内存不足,所以推荐重点关注VmSize的增长情况。

内存模块概览:从虚拟机角度看内存的分布

指标名说明
JavaHeap从 Java 或 Kotlin 代码分配的对象的内存。由于Java堆之外的内存分配与Java分配绑定。应用程序将调用Android框架,Android框架调用Native库,并且内存分配。它们的生命周期将与Java对象相关联。优化 Java Heap 上的对象,也有助于其它类型内存的回收。
NativeHeapNatie Heap(从 C 或 C++ 代码分配的对象内存。即使应用中不使用 C++,也可能会看到此处使用的一些原生内存,因为 Android 框架使用原生内存代表处理各种任务,如处理图像资源和其他图形时。
Codedex jar so ttf 等文件占用的内存
Stack栈内存
Graphics指图形缓冲区队列向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存
Other不确定如何分类的私有内存
System系统代码占用的内存
Unknown其它未知内存

内存分配详情:更详细具体的的内存分配

详细具体的说明Heap、Stack、ASH、Device、Mmap、MemTrack、Other等模块分配情况

指标名说明
Native Heap同上:Native/C malloc内存
Dalvik Heap同上:Java/Kotlin对象占用内存
Dalvik Other分法准确分类的Java/Kotlin对象占用的其它内存
Stack栈内存
AshmemAndroid Shared Memory共享内存
Gfx dev驱动反馈的GPU内存,主要是GL纹理大小总和
Other dev分法准确分类的device内存
.so mmap映射的.so代码占用内存
.jar mmap映射的.jar代码占用内存
.apk mmap映射的.apk代码占用内存
.ttf mmap映射的.ttf代码占用内存
.dex mmap映射的.dex(Dalvik 或 ART)代码占用内存
.oat mmap代码映像(预加载类)占用内存,所有应用之间共享
.art mmap堆映像(预加载类)占用内存,所有应用之间共享
Other mmap分法准确分类的mmap映射内存
GL mtrack驱动上报的GL内存使用情况。 主要是GL texture大小,GL command buffer,固定的全局驱动程序RAM开销等的总和
EGL mtrack主要是SurfaceView和TextureView的总和
Other mtrack分法准确分类的mtrack内存

也可参考官方对dumpsys memInfo更详细的说明

功耗

设备电流(功率=电流*电压,设备电压恒定)可以用来衡量整机的功耗情况。只保留待测应用处于前台运行,且尽可能关闭其他应用时,可以用整机的功耗来衡量待测应用的功耗。这就是功耗测评的基本背景。
Android系统提供了官方API来查询当前的电流电压,经过实测,在不同厂商设备上存在电流单位不一致正负值不一致的问题(注意:在没有连接充电线时,电流预期为正值,进行功耗测评时必须关闭USB连接,不能在充电的同时进行功耗的测量),经过反复校验以及和设备厂商的沟通,最终基于官方API进行了兼容处理,实现了对市面上绝大多数机型的适配,能够准确获取设备电流,和电流仪的监控值误差极小。因此确定了通过SDK采集电流来作为衡量功耗的指标。线上ApmPlus功耗监控使用同一实现。
上述原理决定了无法实现类似CPU测评一样仅通过ADB即完成工作,这里APM提供了一个额外的功耗测评App(名为手机端的AnyTrace),App里包含了开发的电流采集SDK。采集到电流数据后,再通过socket传输到桌面端的App性能分析工作台(此处开发基于Facebook开源的Flipper)。

前提条件

  • 性能分析工作台的版本为0.3.0以上的版本。

  • 手机已下载并安装AnyTrace。
    采集过程中,需要保持AnyTrace不被系统优化杀死,所以如果您的手机有耗电优化策略,注意把AnyTrace放到白名单中。一般情况下,App会开启前台服务,大部分手机不会关闭。

  • 手机和电脑需要连接在同一WiFi下。在进行功耗测评时,按照软件提示进行WiFi的连接。另外,部分设备的WiFi连接稳定性较差,尽量选择连接稳定的WiFi进行使用。

操作步骤

  1. USB连接手机,选择待测App。

  2. 在左侧导航栏,单击性能测评

  3. 在性能测评页面,选择功耗数据

  1. 单击启动。软件开始尝试进行WiFi连接、手机端App连接。

  2. 断开USB链接后,单击确定。然后再在设备列表里选择WiFi标识的待测设备。选择设备后,可能需要重新选择待测App和进程。

  3. 在WiFi设备、待测App、待测进程都完备后,再次单击启动。即可采集到电流数据。

异常排查

  • 如果出现离线提示,则意味着WiFi失联,可能是因为手机WiFi不稳。如果不能自动恢复,请重启手机。

  • 如果WiFi设备、待测App、待测进程都完备,单击启动后仍弹出对话框,提示无法采集或始终无法出现测评图表等如下图的BadCase,请依次尝试以下解决方法:

    • 手动启动手机端的AnyTrace App。
      功耗测评开启后,桌面软件会尝试自动触发启动,但因为兼容性等原因,可能启动失败,这时候需要您手动进行。
    • 重启App性能分析工作台
      保持WiFi连接,且不要插入USB连接,无需重启手机和电脑。
  • 其他情况请在交流群中反馈。反馈前,可连续单击左下角版本号5下,会弹出已上传提示,把异常日志上传到后台,便于分析。

iOS

  • CPU使用率:App、整机
  • FPS:fps、jank、bigJank、jankTime,stutter
  • Memory内存:memory、vm、resident
  • GPU:device、renderer、tiler
  • Net:down、up
  • IO:read、write

CPU使用率

使用率=总CPU使用率(Xcode中展示的使用率)/核心数

  • TotalCPU: 整机CPU使用率
  • ProcessCPU: 进程CPU使用率

FPS

1秒内应用界面真实平均刷新次数,俗称帧率/FPS

  • FPS Avg: 平均帧率(一段时间内平均FPS)

  • Jank

    • 当前帧耗时>两帧电影帧耗时(1000ms/24*2=84ms)。
  • BigJank

    • 当前帧耗时>三帧电影帧耗时(1000ms/24*3=125ms)。
  • Stutter
    指定时间内卡顿的时长占比,Stutter(卡顿率) = ∑Jank time / Time,Jank为卡顿次数,Stutter为卡顿率,Jank和Stutter趋势有一致性,但并非完全线性,因为每次Jank卡顿严重性是不一样的。同时也说明了,没有Jank卡顿出现,自然也就卡顿率是0了。

Memory

  • memory: 即footprint,实际使用的物理内存,包含压缩内存的实际大小,常用于OOM分析 参考
  • vm:(64位CPU的最大寻址空间为2的64次方bytes,计算后其可寻址空间达到了惊人的16TB(treabytes),即16384GB)
  • resident: 实际物理内存占用,既Instruments中Resident Memory Size。注:物理内存系统策略有关,衡量内存指标时不会关注,但是它有助于分析定位整体性能问题。比如:footprint没有降低,说明应用没有释放内存,但是real memory却降低了,说明系统对内存做了压缩。由于压缩会占用CPU资源,同时相应会导致FPS降低

GPU

  • render: 渲染器利用率(像素着色处理阶段,若占比高,说明是PS阶段出现瓶颈,shader过于复杂或纹理大小、采样复杂等)
  • tiler: Tiler利用率(顶点着色处理阶段,若占比高,说明是VS阶段出现瓶颈,顶点数太多等原因)
  • device: 设备利用率(整体GPU利用率)

Network

  • up: 上行流量
  • down: 下行流量

I/O

  • read: 读取
  • write: 写入

Battery Power - 功耗(仅wifi连接可用)

  • 电流: 当前电池电流的绝对值,单位-mA
  • 电量: 当前电池电量,单位-%
  • 电压: 当前电池电压,单位-V
  • 温度: 当前电池温度,单位-摄氏度

测评指标标准

不同业务类型、不同场景下,资源使用差别较大,并非要追求资源消耗的绝对的低值,需要和业务需求、用户体验间综合衡量,建立业务指标和性能指标的关联关系,然后选择合适的指标和标准进行控制和优化。同时,一般情况下,还需要针对高中低三档机型进行分别设置。
例如,低端机上同样的代码性能较差,在无损降级取得一定收益后,已经无法取得相对大盘更大的收益,通过AB实验发现一定的有损降级,比如去掉某些动画,能带来更好的单击率的数据,通过反复调整降级点,在线下取得更好的性能指标,最终在线上也带来了显著的播放时长收益。最终确立了低端机下后续的性能标准。
一般的指标确立思路如下所示:

  • 当前版本指标定为标准,新版本保证不劣化(或者在一定范围内,比如启动耗时增加少于5毫秒)。

  • 针对显著影响直观感受的先确定明确的卡口标准。比如Feed流的滑动卡顿对用户体验有明显的损失,方便确定中档机型FPS均值不低于58,持续滑动1分钟卡顿次数少于2次。

  • 尝试一定的劣化实验验证预期收益。比如AB实验发现启动增加10%,用户留存明显降低,基本可以确定,如果能优化启动10%,那么能给留存率带来接近的提升。那么指标标准就应该进行提高。

导入导出

性能测评的数据可以导出,然后用软件导入可以恢复展示。
其中,windows版本需要通过快捷键触发。导入:ctrl + i,导出: ctrl + e

生成Excel

性能测评的原始数据和报告数据也可以导出为Excel格式。

添加标记

在图表上双击添加标记。单击标记位置可以删除标记。

FAQ

  1. 数据的准确性如何保证?
    在内部抖音、头条上多个App经过了大约一年多的验证,尽可能保证了数据采集和计算的准确度。

  2. 指标是否有标准,即超过多少作为性能发生异常?
    参考上文指标标准。

  3. iPhone的IP地址的获取

    设置 > 无线局域网 > WiFi详情 > IP地址。

  4. iPhone的Mac地址的获取

    设置> 通用> 关于本机> 无线局域网地址,不应为WiFi详情中无线局域网地址,WiFi设置中一旦开启私有地址,该MAC地址就会改变,关于本机中的无线局域网地址固定不变。

  5. iPhone WiFi连接失败

    • iPhone与PC是否在同一局域网下
    • IP或MAC地址是否填错,参考获取方式
    • iPhone未信任对应电脑,请先通过USB连接电脑,并信任该电脑
    • iPhone未开启WiFi连接的权限(首次使用WiFi连接或主动禁用WiFi),请通过USB授权WiFi连接(设备选择框> 连接远程设备)
  • 限制级WIFI(部分公司内网)

  • 通过USB授权WiFi连接并输入IP & Mac地址,参考获取方式,windows用户需先安装Bonjour SDK