【鸿蒙开发】性能优化
语言层面的优化
使用明确的数据类型,避免使用模糊的数据类型,例如ESObject。
使用AOT模式
AOT就是提前编译,将字节码提前编译成机器码,这样可以充分优化,从而加快执行速度。
未启用AOT时,一边运行一边进行机器码的生成。
开启AOT后,设备能直接运行已经提前优化过的机器码,大大提高执行速度。
应用启动优化
应用阶段划分:
- 第一阶段:应用进程的创建和初始化
- 第二阶段:App和Ability的初始化
- 第三阶段:Ability生命周期
- 第四阶段:加载绘制首页
每个启动阶段的优化策略:
- 第一阶段优化:设置合适分辨率的应用图标
- 第二阶段优化:减少首页Ability或者Page中import的模块数量,不是首页必须的模块可以使用动态异步加载,如await import(‘Page’)
- 第三阶段优化:Ability生命周期方法中,对于耗时操作进行异步处理
- 第四阶段优化:延迟加载,减少不必要的首页内容。例如使用LazyForEach替换ForEach
LazyForEach替换ForEach
LazyForEach是一种懒加载的模式,在循环绘制组件时能显著提升页面的加载速度。结合cacheCount方法能控制列表的缓存数量,实现更优的滑动体验。
减少丢帧卡顿
- 避免在主线程上执行耗时操作:将耗时操作放在TaskPool或者Worker等后台进程中执行,从而防止主线程负载过高。
- 减少渲染进程的冗余开销:使用资源图代替绘制、合理使用renderGroup、尺寸位置使用整数。
- 减少试图嵌套层级
- 组件复用
- 控制状态变量关联的组件数量
- 在对象上谨慎使用状态变量进行关联
优化案例
组件转场动画推荐使用transition,不推荐使用animateTo方法。
减少animateTo方法的使用数量,一起变更比分开变更更加高效。
多次animateTo时统一更新状态变量,减少多次更新状态变量导致的开销。
使用RenderGroup可以缓存组件及其子组件的绘制,从而降低绘制负载优化渲染性能。适合没状态绑定的不变组件,如果有状态绑定,当状态变化时缓存就是失效了。
使用@Reusable标记复用组件,适用频繁创建和销毁的组件,或反复切换条件渲染的控制分支且控制分支中的组件子树结构相同。
不推荐使用更新单个状态变量的形式控制多个组件的更新(命令式);
推荐使用状态变量和组件一对一绑定的方式,以数据变更驱动组件的刷新(声明式);
合理控制状态变量更新范围,避免关联刷新大量组件。关联变化较大的状态变量可以通过对象组合成一个状态变量,针对渲染成本较高的组件建议使用独立的状态变量进行关联。
理解@Prop和@ObjectLink的区别:@Prop是深拷贝关联,@ObjectLink是浅拷贝关联,因此优先推荐使用@ObjectLink的方式,从而减少系统内存开销。
性能调优工具
待补充