鸿蒙性能优化相关

ArkTS基于TypeScript设计,但又有所区别,比如ArkTS不支持属性的动态变更,变量或参数需要明确和返回值声明。

提升应用启动和相应速度

什么是冷启动:应用第一次启动,后台无该进程,需要创建新的进程,这种启动方式叫做冷启动

使用异步加载:

使用异步加载可以在后台线程中处理耗时操作,提升相应速度

延迟加载:

将不必要的资源延迟加载可以减少启动时间。使用list,grid,swiper等容器组件时配合系统提供的lazyforeach数据懒加载能力,可以有效减少启动时间和内存占用。

使用缓存:

选择合适的缓存策略可以提高应用程序的性能和相应速度,从而提高应用的相应速度

HarmongOS应用启动过程:

启动过程大概可以分为四个阶段

第一阶段:应用进程创建&初始化

StartAbility,StartProcess,MainThread init&Attach

第二阶段:Application&Ability初始化

HandleLaunch Application,HandleLaunch Ability

第三阶段:Ability生命周期

HandleAbility Transaction

第四阶段:加载绘制首页

OnLoad Content,LoadPage Source,OnVsyncEvent

提升冷启动的方法:

1,缩短应用进程创建&初始化阶段耗时:设置合适分辨率的startWindowIcon

2,缩短Application&Ability初始化阶段耗时,减少Ability或者Page中import模块

3,缩短Ability生命周期阶段耗时:使用异步加载

4,缩短加载绘制页面阶段耗时:延迟加载

如何减少丢帧卡顿

避免主线程执行耗时操作

UI主线程上执行耗时操作会阻塞UI渲染,导致UI线程负载过高,可以将耗时操作放在TaskPool或者Worker等后台线程中执行

减少渲染进程的冗余开销

使用资源图代替绘制,合理使用renderGroup,尺寸位置尽量设置尽量使用整数,可以减少渲染所需的时间,从而减少丢帧卡顿

减少视图嵌套层级

减少嵌套层次使用高性能布局节点,可以减少丢帧卡顿

组件复用配合LazyForEach

使用ArkUI开发范式提供的组件复用机制,通过重复利用已经创建过并缓存的组件对象,降低组件短时间内频繁创建和销毁的开销,提升组件加载效率,降低UI线程负载,从而减少丢帧卡顿。

精确控制状态变量的关联组件数

@State等状态变量关联的组件越多,状态变动时刷新的组件也越多,UI线程负载越重,因此移除冗余的组件关联可以减少丢帧卡顿

在对象上谨慎使用状态变量关联

@Prop是深拷贝,@ObjectLink是浅拷贝,Prop直接复制了整个数据,而ObjectLink是引用的拷贝

所以在@Prop和@ObjectLink使用效果相同的场景下优先使用ObjectLink方式可以减少系统内存开销

使用if/else和visibility属性控制
  • 通过if条件判断控制显示与隐藏的方式:
    • 对比判断值为true和false时,初次加载过程中Measure、Layout时间明显存在区别,并且从组件创建时间可以判断,加载时会根据初始值判断是否创建对应组件内容。
    • 当条件为false时,对应的组件内容不参与创建、Measure和Layout阶段。
  • 通过visibility控制显示与隐藏的方式:
    • 在初次加载时,无论visibility的值为Visibility.None还是Visibility.Visible都会创建对应组件内容。
    • visibility属性控制的是Measure和Layout阶段,当visibility属性为Visibility.None时,对应的组件不参与Layout。

结论:建议经常控制出现隐藏的使用visibility控制

不经常出现的使用if判断是否出现

丢帧卡顿

应用丢帧通常指的是在应用程序的界面绘制过程中,由于某些原因导致界面绘制的帧率下降,从而造成界面卡顿、动画不流畅等问题。以60Hz刷新率为例子,想要达到每秒60帧(即60fps)的流畅体验,每一帧需要在16.7ms内完成,如果超过16.7ms未完成渲染,就可能会出现丢帧。

在HarmonyOS中,图形系统采用了统一渲染的模式,遵循着一个典型的流水线模式,以90Hz刷新率为例,每个Vsync周期是11.1ms,整个过程如下图所示。如果是60Hz,每个Vsync的周期是16.7ms;如果是120Hz,则每个Vsync的周期是8.3ms。

总结

布局性能优化

布局时应尽量减少总节点数,减少性能消耗

优化方向

1,移除冗余的节点

2,使用扁平化布局减少节点数

具体内容:

移除多余的外层线性布局

切换不同的布局类型实现扁平化

合理控制元素的显示隐藏

设置固定宽高减少measure的耗时(未设置和百分比宽高性能消耗较大)

仅在必要环境下使用高性能布局

长列表加载性能优化

主要分为四种

懒加载(10000条数据以上时建议使用lazyforeach)

缓存列表项(额外缓存部分列表项,一般为页面数据显示条数/2)

组件复用(减少组件创建的耗时操作@Reusable,aboutToReuse)

布局优化(相对布局,控制布局在5-8层)

相关推荐
青云交1 小时前
大数据新视界 -- 大数据大厂之 Impala 性能优化:跨数据中心环境下的挑战与对策(上)(27 / 30)
大数据·性能优化·impala·案例分析·代码示例·跨数据中心·挑战对策
Winston Wood4 小时前
Perfetto学习大全
android·性能优化·perfetto
EterNity_TiMe_4 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
程序猿进阶5 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
工业甲酰苯胺13 小时前
Redis性能优化的18招
数据库·redis·性能优化
无尽的大道19 小时前
深入理解 Java 阻塞队列:使用场景、原理与性能优化
java·开发语言·性能优化
loey_ln19 小时前
webpack配置和打包性能优化
前端·webpack·性能优化
郭梧悠1 天前
HarmonyOS(57) UI性能优化
ui·性能优化·harmonyos
奈斯ing1 天前
【Oracle篇】SQL性能优化实战案例(从15秒优化到0.08秒)(第七篇,总共七篇)
运维·数据库·sql·oracle·性能优化