当前位置: 首页 > 编程日记 > 正文

如何实现流畅观影体验?视频类应用内存和CPU大调查

如果把手机内存和CPU想象成固定面积的田地,单个应用对内存和CPU的占用则可比喻为个人的一亩三分地儿。当应用内存和CPU占用过高时,便过多占用了整个田地资源,挤压了邻家应用的面积,那么手机能够同时运行的应用的数量就会相应减少。

应用过度消耗手机的内存和CPU将会导致手机卡顿、延迟、甚至崩溃等现象频发,严重影响用户体验。

本次华为DevEco云测平台提供了一套专业的测试方法及解决方案,对具有代表性的几款视频类应用在不同使用场景下消耗手机内存和CPU的情况进行检测。

1、测试环境

测试平台:DevEco云测平台

(https://deveco.huawei.com/)

测试对象:腾讯视频6.2.2.17134、爱奇艺9.7.0、优酷7.3.8、搜狐视频6.9.9、乐视视频8.0、芒果TV5.8.6 华为应用市场可下载版本。

测试环境:

硬件环境:华为P20 6G+64G

软件版本:基于Android 版本8.1 EMUI

测试步骤:

1. 登陆DevEco-> 测试服务->性能测试。

2.创建任务界面:测试介绍->机型选择,选择P20->测试配置,上传应用并配置账户登陆信息->提交。

2、测试方法

1.内存测试

建议达到标准:

  • 应用前台内存占用 <= 500MB;
  • 应用后台内存占用(亮/灭屏)<= 400MB。

测试方法:

通过反射调用android.app.ActivityManagerNative里面的getProcessMemoryInfo方法,获取应用的PSS(应用使用内存)使用情况:appMemoryInfos[0]。

如下图,以com.tencent.qqlive为例:

2.CPU测试

建议达到标准:

  • 应用后台CPU占用(亮/灭屏)<=2%

测试方法:

第一步:记录初始时CPU使用情况

测试开始时,通过读取/proc/进程pid/stat,获得进程的CPU统计信息:

当前后台运行应用占用CPU时间:AppT0=cpuInfos[13]+ cpuInfos[14]。

通过读取/proc/stat,获取整个系统的CPU占用率,结果如下:

TotalT0= cpuInfos[1] + cpuInfos[2] + cpuInfos[3] + cpuInfos[4] + cpuInfos[6]+ cpuInfos[5] + cpuInfos[7]

第二步:记录结束时CPU使用情况

测试结束时,通过读取/proc/进程pid/stat,获得进程的CPU统计信息:

当前后台运行应用占用CPU时间:AppT1=cpuInfos[13]+ cpuInfos[14]

通过读取/proc/stat,获取整个系统的CPU占用率,结果如下:

TotalT1= cpuInfos[1] + cpuInfos[2] + cpuInfos[3] + cpuInfos[4] + cpuInfos[6]+ cpuInfos[5] + cpuInfos[7]

计算公式:

cpuRate = (AppT1-AppT0)/(TotalT1- TotalT0)

*异常情况:排除AppT1-AppT0小于0,CPU使用率为0的情况。

如下图,以com.tencent.qqlive为例:

3、测试结果对比

1.视频类应用内存占用对比 (前台)

通过对比各应用最新版本在同一设备中的前台内存占用数据,可以清晰的呈现出各应用内存占用情况。

由图一可见,六款视频应用均表现良好,符合测试标准(<500MB)。其中,乐视视频和搜狐视频表现最优,内存占用远低于标准线。

2.视频类应用内存占用对比 (后台)

图二是视频类应用最新版本在手机后台亮/灭屏情况下内存占用情况。

六款视频类应用后台内存占用均低于标准线(<400MB),性能表现良好,其中搜狐视频后台内存占用最低。

3.视频类应用CPU占用对比 (后台)

图三是视频类应用最新版本亮/灭屏CPU占用情况,搜狐新闻、腾新视频、优酷视频、爱奇艺的CPU占用率较低,性能良好。

乐视视频和芒果TV两个应用的CPU占用过高,超过绿色达标线一倍多,需引起开发者重视。

总结:

通过以上的数据对比,六款主流视频应用的内存占用均位于绿色标准线以内,表现良好;而在CPU后台占用中,乐视视频、芒果TV CPU占用则远高于绿色标准线,占用过高将对用户体验造成不良影响。

内存和CPU的占用所导致的手机延迟、卡顿甚至是崩溃等现象,对视频类应用的用户体验影响是非常直接的,因此也与用户的留存和活跃度息息相关。希望开发者们予以重视,将应用内存和CPU的占用保持在绿色达标线以内,华为终端开放实验室也将与开发者一起为打造绿色健康的安卓生态不懈努力。

4、高内存和CPU占用原因分析

应用内存和CPU占用过高会严重影响用户体验,那么造成这种现象的根本原因是什么?

1.高内存占用原因:

1)内存泄漏是引发应用内存问题的主要原因,长时间内存泄漏会占用大量内存。常见的内存泄漏如:Context泄漏(Activity传递泄漏、context未使用applicationContext),Handle泄漏(在handler中持有context等做耗时操作),Cursor泄漏(使用完cursor后未关闭),register后未unregister等。

2)复杂的界面布局,过多的view层级,也会占用大量的内存。

3)使用传统的Java API中提供的HashMap工具类会相对比较低效,也会占用过多的内存。

2.高CPU占用原因:

1)网络请求过多,导致持续占用CPU。

2)存在特殊的布局或者特殊操作(GPS等需要一直刷新的服务),特殊加载(图片、视频、音频等)。

3)有过多的图表、曲线图等绘制操作。

4)大量的图片、视频处理、加载货布局操作。

5、优化建议

针对通过DevEco云测平台测试发现内存、CPU占用超标、过高的现象,建议开发者从以下几方面对内存和CPU占用进行优化:

1.内存占用优化建议:

  • 尽可能设置视图为不透明;
  • 不要阻塞主进程;
  • 避免重复处理数据;
  • 选择正确的数据格式;
  • 数据结构优化;
  • 对象复用;
  • 避免内存泄漏。

2.CPU占用优化建议:

  • 大量图片、音频、视频处理最好使用JNI技术来实现;
  • 传输完数据就将线程关闭,立即释放资源,不要让线程在一直空转等待下次数据的传输。

转载于:https://www.cnblogs.com/androidga/p/9603787.html

相关文章:

dmol3给定关键字不在字典中_python中的数据结构与算法(2):字典与集合

1. 字典是什么字典是便于信息检索的一种数据结构&#xff0c;鉴于信息检索在程序中无处不在&#xff0c;字典的使用场景也非常广泛&#xff0c;包括许多 python 内部机制的实现&#xff0c;也依赖字典结构&#xff0c;比如命名空间的管理等。检索一般是根据关键字查找与它关联的…

HTTP项目1.0 -- HTTP协议基础知识

一. HTTP之URL篇首先来看一下&#xff0c;我们一般在上网的时候&#xff0c;地址栏中经常会显示的信息&#xff0c;这里就举一些简单的例子https://www.baidu.comhttps://113.2.7.58.25/a/b/c.html从上面的简单的例子我们把url分成了以后的几个部分&#xff0c;请看下图第一个协…

SQL Server 远程无法连接

1. 查看默认1433端口是否已经开启。转载于:https://www.cnblogs.com/jiajinyi/archive/2013/05/21/3091091.html

WCF客户端不能用在Using语句块中,因为它可能会抛出不可预知的异常。即使你捕获了异常,仍有可能一直保持连接。...

WCF客户端不能用在Using语句块中&#xff0c;因为它可能会抛出不可预知的异常。即使你捕获了异常&#xff0c;仍有可能一直保持连接。让我们来看看形成这一问题的历史原因&#xff0c;并提出几个补救措施。 在.NET中&#xff0c;资源管理的基础就是IDisposable和Using语句块。除…

关于 MongoDB 与 SQL Server 通过本身自带工具实现数据快速迁移 及 注意事项 的探究...

背景介绍 随着业务的发展、需求的变化&#xff0c;促使我们追求使用不同类型的数据库&#xff0c;充分发挥其各自特性。如果决定采用新类型的数据库&#xff0c;就需要将既有的数据迁移到新的数据库中。在这类需求中&#xff0c;将SQL Server中的数据导入到MongoDB 中显得尤为突…

语音计算矩形面积_LeetCode85-最大矩形

今天在制作书签的时候突然想到了一个问题如果要送给未来的女朋友一个书签上面该写些什么话哈哈哈哈哈哈哈哈哈The Spring is coming!想了一会儿&#xff0c;觉得这句话最合适To xxx:天使的笑&#xff0c;灿烂的心&#xff01;&#xff01;&#xff01;哎&#xff0c;还是先找个…

模板的分离编译

模板不支持分离编译我们来分析一下模板为什么不支持分离编译呢&#xff0c;所谓的分离编译就是我们在编写程序的时候可能会出现如下的一种情况就是&#xff0c;&#xff08;我下面就是举具体的例子了&#xff09;代码//*****************template.h***********// #include<i…

什么是壳 - 脱壳篇01

什么是壳 - 脱壳篇01 让编程改变世界 Change the world by program 壳 在自然界中&#xff0c;植物用壳来保护种子&#xff0c;动物用壳来保护身体&#xff0c;我们人类没有壳&#xff0c;但我们有衣服&#xff0c;房子也起到了壳的作用。不仅保护&#xff0c;而且美观。 同…

push、pop指令

push、pop指令转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/25/3846605.html

个人前端学习路线图与github优秀前端开发者的路线图推荐

1、个人目前学习的路线图 2、github优秀前端开发者的路线图推荐 打开github首页&#xff0c;在搜索框输入developer-roadmap&#xff0c;搜索github前端路线图 选择kamranahmedse/developer-roadmap拥有56.5k的星&#xff0c;足以证明这个路线受到广大前端开发者的喜爱与推荐 选…

智能指针1.0

一.使用普通的动态内存开辟存在的问题 我们在使用动态内存开辟一个空间的时候&#xff0c;需要释放掉这个空间&#xff0c;不然就容易出现内存泄漏。 比如下面的程序 情况一&#xff1a; #include<iostream> using namespace std; int errorTest() { intflag 0; …

gen_event中的handler和supervised handler

呃&#xff0c;在gen_event中有两个添加handler的方法 gen_event:add_handler/3 gen_event:add_sup_handler/3 一开始总是有些迷惑两者的区别&#xff0c;今天查看了gen_event源码&#xff0c;总算弄清两者的区别。 add_handler添加的只是把gen_event作为容器&#xff0c;仅仅在…

动态刷新_屋盖“起飞”刷新国内记录,中建八局杭州萧山国际机场项目最新动态来袭...

近日&#xff0c;中建八局承建的杭州萧山国际机场三期项目完成了一件“壮举”T4航站楼首段钢屋盖网架顺利提升至设计标高一举刷新了国内机场航站屋盖单次提升的记录正式进入主楼屋面及幕墙施工的新篇章两段视频速看首段钢屋架提升刷新记录 覆盖测量全过程监控杭州萧山国际机场…

逻辑 STANDBY ORA-00368日志应用失败处理一例

故障现象&#xff1a;逻辑STANDBY数据库注册日志成功&#xff0c;但应用日志出现错误&#xff0c;提示“ORA-00368: checksum error in redo log block”&#xff0c;显然是文件受到了破坏。Tue Jul 24 08:25:59 2012LOGMINER: WARNING: error 368 encountered, failed to read…

Linux 下实现虚拟光驱功能,查看iso文件内容

1,创建挂载点&#xff08;也可以不创建&#xff0c;直接用现有的目录&#xff09;openSUSE:~ # mkdir /mnt/iso2&#xff0c;挂载ISO文件至创建的挂载点openSUSE:~ # mount -t iso9660 -o loop /home/ubuntu-14.04.5-server-amd64.iso /mnt/isomount参数解释&#xff1a;-t&…

clientcontainerThrift Types

首先声明&#xff0c;我是一个菜鸟。一下文章中出现技术误导情况盖不负责 来自Apache Thrift官网&#xff1a;Thrift Types Thrift Types The Thrift type system is intended to allow programmers to use native types as much as possible, no matter what programming lang…

简易git操作 -- 让你的格子绿起来

创建github账号 浏览器输入网址&#xff0c;申请一个github账号&#xff0c;github申请网址&#xff0c;看到下面的图片内容&#xff0c;点击图中红色框里面的内容&#xff0c;用邮箱账号申请一个github账号&#xff0c;一定记住账号和密码 填写注册信息 点击之后跳转到下面…

c语言自定义char*函数返回值是乱码_[每日C语言」printf()函数的修饰符和返回值...

在上一个小demo《printf()函数(1)》中主要说了一下printf()函数的转换说明符&#xff0c;这些转移说明符是可以被修饰的。我们可以在%d和定义的转义字符之间通过插入修饰符对基本的转换说明加以修改。printf()修饰符digit(s) 字符宽度的最小值结果&#xff1a;不够的前面补空格…

win2003辅助域服务器相关几个错误日志的解决办法

1.域助域上做了DNS后,提示:浏览器无法更新服务状态位,数据有错误,错误代码是8007关闭computer browser基本就行了,有人说还要关server,它负责共享之类的,如果关了,就不能共享了,我个人没有关!2.之前,公司主域上有DNS,不过没有允许复制区域,也没有在辅助域上做DNS,所以在辅助域上…

redis.conf配置文件参数说明

参数说明 redis.conf 配置项说明如下&#xff1a;1. Redis默认不是以守护进程的方式运行&#xff0c;可以通过该配置项修改&#xff0c;使用yes启用守护进程daemonize no2. 当Redis以守护进程方式运行时&#xff0c;Redis默认会把pid写入/var/run/redis.pid文件&#xff0c;可以…

用C#来开发CAD插件,含源代

CAD插件看起来很神秘&#xff0c;其实一个合格码农经过几天就能快速掌握。没什么秘密&#xff0c;开发CAD插件和winform一样简单&#xff0c;多学几个类库用法就是&#xff0c;在CAD里展现界面和winform略有不同。学习CAD插件开发的动机是为了薪水&#xff0c;由于公司是做显示…

动态内存管理和智能指针 2.0 -- shared_ptr

shared_ptr出现原因 通过第一章的学习&#xff0c;我们知道不管是auto_ptr合适scoped_ptr都是存在缺陷的&#xff0c;于是我们必须想出一个方法既能很好的管理我们的内存&#xff0c;而且在使用的时候&#xff0c;可以多个指针指向一个内存&#xff0c;这个时候就出现了shared…

汇总同一时间段的数据_数据集干货:一文读懂Mapsidejoin

我们知道数据分析的第一步是准备数据&#xff0c;所以在前面的课程里&#xff0c;我们介绍了元数据。今天这篇文章&#xff0c;主要介绍大数据量组合数据集在永洪中的应用实例&#xff1a;Mapsidejoin。什么是Mapsidejoin&#xff1f;按照字面意思&#xff0c;Mapsidejoin就是M…

【强烈推荐】国土档案管理信息系统产品使用说明书系列目录【附下载地址】...

<<国土档案管理信息系统>>产品使用说明书系列目录【附下载地址】——通过知识共享树立个人品牌。《国土档案管理信息系统》在线视频讲解一、记大型商业软件<<国土档案管理信息系统>>之系统简介记大型商业软件 > 之系统简介 ——通过知识共享树立个人…

zip函数的使用

s [[1, 10], [1.2, 11], [2, 5], [5, 15]] data zip(*s) x_list data[0] y_list data[1] x_min min(x_list) x_max max(x_list) y_min min(y_list) y_max max(y_list) box [x_min, x_max, y_min, y_max] print(box) # [1, 5, 5, 15] 转载于:https://www.cnblogs.com/…

计算机网络基础 1.0 -- 概述

概念理解 报文&#xff1a;在网络中发送的数据块成为报文在发送报文之前&#xff0c;通常会把数组分组&#xff0c;每个组都有个包头和数据组成&#xff0c;包头中包含了诸如目标地址和源地址等重要信息&#xff0c;这样才保证了数据能够有目的的在网络中的传输主机是用户用来…

字符串循环同构的最小表示法(转)

循环字符串的最小表示法的问题可以这样描述&#xff1a; 对于一个字符串S&#xff0c;求S的循环的同构字符串S’中字典序最小的一个。 由于语言能力有限&#xff0c;还是用实际例子来解释比较容易&#xff1a;设Sbcad&#xff0c;且S’是S的循环同构的串。S’可以是bcad或者cad…

周长相等的正方形面积一定相等_必考单元:三年级下册面积计算公式+知识点+测试卷(附答案),重点内容,收藏练习!...

《面积》公式 知识点面积和面积单位&#xff1a;1.常用的面积单位有&#xff1a;(平方厘米)、(平方分米)、(平方米)。2.理解面积的意义和面积单位的意义。面积&#xff1a;物体表面或封闭图形的大小&#xff0c;叫做它们的面积。1平方米&#xff1a;边长是1米的正方形&#xff…

sql server 2000 版本查询

确定已安装的 SQL Server 2000 Database Components 版本 使用 isql、osql 或查询分析器&#xff0c;对数据库引擎实例执行以下查询之一。 SELECT SERVERPROPERTY(ProductLevel) SELECT VERSION SELECT SERVERPROPERTY(Produc…

ubuntu16创建开机启动服务

1、cd /etc/init.d/ 2、sudo touch zookeeper&#xff08;举例&#xff09; 3、给服务赋权限&#xff1a;sudo chmod x zookeeper 4、执行sudo vim zookeeper 命令写入执行脚本&#xff08;启动脚本中的启动命令对应服务的启动命令&#xff09; #! /bin/sh### BEGIN INIT INFO …