手把手讲解--性能优化案例(2)app卡顿优化

要使用它,首先我们要安装好python2.7.16,然后配置环境变量,直到我们能够正常使用python命令(这个没必要详述吧,囧- -!,但是我还是给出本人验证过的攻略地址:https://www.jianshu.com/p/e73768e66b8d).
##正戏
systrace是我们用来抓取一段时间之内的android设备上的数据指标的工具,我理解为: 设备运行日志,只不过这不是文本日志,而是一个html文件,需要使用谷歌浏览器的 chrome://tracing/插件打开。具体步骤如下:
1、打开CMD,进入systrace目录:

2、输入 python systrace.py -b 32768 -t 5 -o mytrace.html wm gfx input view sched freq,然后回车
解释一下这一串命令(本文不做systrace命令的详解,这些东西都是死命令,百度即可):

  • python 将要执行python脚本
  • systrace.py 脚本名称
  • -b 设置缓存区大小
  • -t 抓取5秒日志
  • -o mytrace.html 输出到这个文件内
  • wm WindowManager 日志内包含windowManager信息
  • gfx Graphics 日志中包含图形绘制的信息
  • input Input 日志中包含设备输入的信息
  • view View System 日志中包含View系统的信息
  • sched CPU Scheduling 日志中包含CPU调度信息
  • freq 日志中包含CPU频率信息

这里有个坑:

在某些真机上,比如vivo X7,它会生成html文件失败,莫名其妙,我换成模拟器,就好了,尚未试验其它真机机型。

我使用网易mumu模拟器做实验的时候,得到如下结果:

3、得到文件之后,打开谷歌浏览器:在地址栏输入 chrome://tracing/ 然后load刚才的文件:( 或者你双击该html文件)

image.png

4、这里我们得到了非常多的性能指标,包括上图中红色字体标记的CPU用量,多核CPU调度情况,UI主线程,渲染线程等,但是我们应用层开发,解决的主要是app卡顿问题,一般只需要 去关注 **UI主线程的掉帧情况**即可. 按照下图:

image.png
详解一下这个带圈的F

  • 整个坐标,横轴为时间,从左到右时间刻度增加,代表各项指标随着时间的变化
  • 带圈的F : 有绿色,黄色和红色。其中绿色表示绘制正常,无需我们去关心,需要关注的是 黄色和红色,特别是红色。
  • 鼠标点击其中一个红色的F,然后按键盘G键,就会出现红色的竖线,每两根红线之间代表一帧的时长(大部分手机的屏幕刷新频率还是60帧,所以每次绘制大概是16.67MS),这个F之所以是红色,是因为这一次的UI绘制时长远远超过了1帧,如果UI在1帧时间之内无法完成,便会造成掉帧,一旦掉帧,在用户的感知下,就是卡顿.
  • 看下图:image.png
    使用鼠标拖拽,可以通过图形界面看到这一次绘制所花费的时长:为116.868msimage.png
  • 在下面的Alert栏中发现了疑似掉帧元凶 疑似元凶
    这里反映出,是我们的bitmap图上传导致了掉帧。
    我们继续把下面两个箭头展开,能够看到:image.png
    这里的英文描述,则是 谷歌工程师给我们的建议.我来大概翻译一下这段话:
    第一段的description意思是:修改/新绘制的位图必须上传到GPU。因为如果上传的总像素量很大,这是很昂贵的,所以每帧减少这个动画/上下文中位图的波动量。
    第二段description的意思是:生成这个帧的工作被重新调度了几毫秒,这是jank的功劳。确保UI线程上的代码不会阻塞其他线程上的工作,并且后台线程(例如网络或位图加载)在android.os上运行。进程#THREAD_PRIORITY_BACKGROUND或更低,因此它们不太可能中断UI线程。这些后台线程应该在内核进程的调度部分以130或更高的优先级出现。
    总的来说,就是Bitmap的使用不当导致掉帧,解决方法大概是:bitmap太大了 要裁剪成合适的大小 或者在背景线程去加载
    至于更加具体的其他掉帧情况的解决方法,就要根据具体遇到的情况去查资料了。

##关于Trace.beginSection 和 Trace.endSection

这两个api是androidSdk自带的,作用是给systrace加上tag,加了tag,就会在systrace图形上反映出我们这两个api之间囊括的一段代码的执行情况。
简单来说,就是你在 一段代码的前后,加上 Trace.beginSection 和 Trace.endSection ,像这样:那么,你在 systrace图形上就会发现这个。

可见,我们代码的执行耗时等情况可以 反映在systrace图形上,点击上面红框的区域,就会在systrace界面底部发现:,如果加了tag的代码的执行耗时超过了一帧时长(16.67MS),则说明这一段代码造成了UI主线程掉帧,用户就有可能感觉到卡顿。

##这里有个坑

如果你上面加了trace.beginSection和endSection,你在图形中还是没有看到 你自己设置的tag,那么检查一下你的 systrace命令,是不是没有加 -a [app包名]
image.png

##做个结论

上述例子,我使用的是app冷启动时抓的systrace,所以这里的掉帧,就是反映出冷启动过程中代码写的有问题。注意,抓systrace的时间不要太长,必须在systrace开始执行之后再操作app。

在发现掉帧的情况之后,看alert就能看出谷歌给我们的app优化方向建议,虽然还没有完全解决问题,但是至少确定了一个大方向,知道了大概哪一段代码出了问题。


#TraceView

在app代码中加入 Debug.startMethodTracing("/sdCard/zhouzhou");Debug.stopMethodTracing(); 然后运行app,确保能够执行上面两个代码包含的代码片段 。比如像这样:image.png

##坑坑

上面的代码,如果你加了之后运行直接抛了异常,检查一下你有没有加这个权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

接下来,找到这个文件,导出到电脑上:

然后就要用到我们最先说道的DDMS,先打开DDMS,File- openFile 打开刚才的.trace文件

image.png这里包含了这段代码中所有的方法调用。
##表格说明
上方有一张表格,每一列的说明如下:
image.png
这么多东西,我们不可能全都关注,只需要关注两个:

  • Cpu Time/Call 函数平均执行时间较长的函数;(耗时较长的函数)
  • Call+Recur Calls/Total,调用次数非常频繁的函数。

如果发现,上面两个指标超乎寻常,比如调用次数特别多,每一次调用耗费时间特别长的,而且又能够是我们自己写的方法,那么基本上就能确定优化点了。

#关于过度绘制

概念:如果屏幕的一片区域,在渲染的过程中,被绘制了太多次,则称为过度绘制
如何检查: image.png
上图是mumu模拟器的设置界面,我们点击显示过度绘制区域,就会发现界面颜色发生了变化:image.png
颜色由浅到深,越深,表示过渡绘制会越严重。大致有以下几种颜色:

  1. 白色:没有过度绘制。
  2. 蓝色:Overdraw 一倍。像素绘制了两次,能够接受,但是如果整个界面都是蓝色的,那么说明还是有绘制的浪费,可以节约一层绘制。
  3. 绿色:Overdraw 两倍。尝试优化。
  4. 浅红:Overdraw 三倍。
  5. 暗红:Overdraw 四倍。非常严重,必须优化。

##如何优化过渡绘制?

  1. 如果你的代码中,通过过度绘制的检查,发现复杂布局显示出大量的过度绘制,那么必须要考虑 用自定义View自己去绘制
  2. 如果你的布局xml中,有大量的嵌套,考虑去掉某些 background ,因为没有了background,UI线程就不会去做这一次绘制
  3. 如果非要用到有background的layout,那么在满足业务需求的情况下考虑减少一定的层级

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总)

面试成功其实是必然的,因为我做足了充分的准备工作,包括刷题啊,看一些Android核心的知识点,看一些面试的博客吸取大家面试的一些经验,下面这份PDF是我翻阅了差不多1个月左右一些Android大博主的博客从他们那里取其精华去其糟泊所整理出来的一些Android的核心知识点, 全部都是精华中的精华,我能面试到现在资深开发人员跟我整理的这本Android核心知识点有密不可分的关系,在这里本着共赢的心态分享给各位朋友。

这份PDF囊括了JVM,Java集合,Java多线程并发,Java基础,生命周期,微服务, 进程,Parcelable 接口,IPC,屏幕适配,线程异步,ART,架构,Jetpack,NDK开发,计算机网络基础,类加载器,Android 开源库源码分析,设计模式汇总,Gradle 知识点汇总…

由于篇幅有限,就不做过多的介绍,大家请自行脑补

,Parcelable 接口,IPC,屏幕适配,线程异步,ART,架构,Jetpack,NDK开发,计算机网络基础,类加载器,Android 开源库源码分析,设计模式汇总,Gradle 知识点汇总…

由于篇幅有限,就不做过多的介绍,大家请自行脑补

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮助你部署ChatGPT模型。以下是一步一步的指南: 步骤1:准备环境 首先,你需要一个Python环境来运行模型。确保你已经安装了Python 3.6或更高版本。 步骤2:安装依赖项 在命令行中打开一个新的终端窗口,并使用以下命令安装所需的依赖项: ``` pip install transformers flask ``` 步骤3:下载并解压模型 从CSDN下载chatglm2-6b模型的权重文件,并将其解压缩到你选择的目录中。 步骤4:创建Flask应用程序 在你选择的目录中创建一个名为app.py的Python文件,并使用以下代码创建一个基本的Flask应用程序: ```python from flask import Flask, request, jsonify from transformers import GPT2LMHeadModel, GPT2Tokenizer app = Flask(__name__) model_path = "path/to/your/model" tokenizer = GPT2Tokenizer.from_pretrained(model_path) model = GPT2LMHeadModel.from_pretrained(model_path) @app.route("/chat", methods=["POST"]) def chat(): data = request.json input_text = data["input_text"] input_ids = tokenizer.encode(input_text, return_tensors="pt") output = model.generate(input_ids, max_length=100) response = tokenizer.decode(output[0], skip_special_tokens=True) return jsonify({"response": response}) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000) ``` 步骤5:运行应用程序 在终端窗口中,导航到包含app.py文件的目录,并运行以下命令来启动应用程序: ``` python app.py ``` 步骤6:测试应用程序 使用HTTP客户端(如Postman或cURL)向http://localhost:5000/chat发送POST请求,并在请求正文中包含以下JSON数据: ```json { "input_text": "你想说的话" } ``` 你将收到一个包含ChatGPT模型生成的响应的JSON响应。 这就是部署chatglm2-6b模型的基本步骤。你可以根据需要进行修改和扩展。希望这可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值