文章目录
简介
记录chrome性能页签的使用和代码优化
需求
在RK3528上通过浏览器访问视频网站并播放视频, 但是由于性能问题, 加载界面缓慢, 视频播放卡顿(1-2帧每秒)
过程
了解页签功能
- 在电脑浏览器打开视频网站, 等待页面自动播放后, 通过菜单中的开发者工具打开控制台
- 切换到网络(network)面板, 观察以
ts
结尾的请求的间隔(这里大概是5秒)
- 切换到性能(performance)面板, 点击开始记录按钮, 等待30秒左右(大约可以包含5个ts加载过程)
- 捕获结束后, 图中的每个黄色区块都是一个ts解码点
- 鼠标移动到箭头所示的空白位置, 以类似于选择连续文字的方式, 选中其中一个解码点
- 选择之后, 会在下方显示统计信息和堆栈信息, 我们的目标就是减少脚本运行用时
Scripting
的数值
- 点击上图中3号标示, 切换到堆栈视图, 可以查看每个方法的耗时和跳转到具体的代码位置
分析代码性能
- 跟踪到下图2个方法时, 用时出现了分叉,点击右侧的代码行数链接跳转到具体的代码位置
- 一般会自动格式化, 如果没有, 可以点击左下角的花括号
- 开启资源覆盖功能: 如果
Page
旁边不是Overrides
, 点击那2个大于符号后选择, 然后点击Select
选择一个空白文件夹注意是空白文件夹
- 在文件名上右键选择
Override content
, 就可以在右侧看到对应的文件列表- 在打开控制台的情况下, 刷新界面会优先加载
Override
的内容 - 如果关闭控制台, 刷新界面则会加载网络的原始内容
- 在打开控制台的情况下, 刷新界面会优先加载
- 并且文件上有个小圆圈, 点击文件名打开该文件, 可以查看到文件内容
- 后续如果不需要了, 可以在文件夹删除此文件
- 后续如果不需要了, 可以在文件夹删除此文件
- 打开刚才选择的文件夹, 在里面找到该文件, 用记事本或其他软件打开
不要在上面显示的代码页签中直接编辑文件, chrome会保存美化后的代码, 导致刷新页面后解析文件时非常卡, 网页白屏
- 添加代码, 排查方法中各代码块运行耗时
js
// 在方法开头添加
const startTime = performance.now();
// 在需要统计的位置添加用时记录
console.log(' code user', performance.now()-startTime);
- 用记事本打开该文件, 内容是压缩后的, 不便于查看和编辑, 可以只美化部分代码, 在方便查看的同时不会导致浏览器卡顿, 以前文截图中的
ik
方法为例:ik
方法前有特殊字符串ih[wX(0x607)+'ve']
(去掉空格后), 在记事本中搜索, 可找到代码的开始位置- 返回控制台, 向下查看代码找到方法的结束位置, 找到另一个特殊字符串
ih[wX(0x11bc)+wX(0x115c)]
- 返回记事本搜索该字符串找到结束位置
- 将这2个方法之间的代码替换为美化后的代码
- 经过排查, 发现以下问题
- 其中的
for
操作的Uint8Array
对象长度非常大 - 对于相同的索引区间, 先进行置0, 再拷贝填充
- 调用
wasm
方法
- 其中的
- 解决方法
- 对于置0后无拷贝的代码块, 改用
Uint8Array
的fill
方法 - 对于置0后拷贝的代码块, 改用
Uint8Array
的set
方法 - 对于先创建数组后进行拷贝的代码块, 改用
Uint8Array
的slice
方法 wasm
看不懂
- 对于置0后无拷贝的代码块, 改用
比对修改结果
- 修改完毕后, 保存文件, 返回浏览器, 刷新页面以便加载修改后的代码
- 验证视频播放正常
- 再次进行性能分析
- 对比优化前, 解码点用时已大幅缩短
- 对优化前(换一个浏览器或chrome打开隐身标签)和优化后的代码进行一次3分钟的性能记录
- 打开页面等待播放稳定再记录
- 比对结果, 大约优化了
50+
(忽略优化前的截图中启用了屏幕截图)
应用到RK3258
- 通过Andriod的WebView组件将优化后的代码应用到RK3528
- autojs6更方便, 但是没搞定其中的WebClient
- 优化前按帧播放, 优化后可以流畅播放1到2分钟再卡一下
- 可能是网络或cpu的共同影响
- 首页加载的速度有点慢