最近在对鸿蒙项目进行性能优化,主要调优以下几点
0:官方参考文档如下:
https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-performance-V5
1:冗余嵌套
由于在开发之初的种种原因,导致项目很多地方出现冗余的嵌套(示例如下),冗余嵌套会导致页面绘制变慢、内存占用增加等问题
2:使用Builder替代自定义组件
当自定义组件不涉及到状态变量和自定义生命周期时,可以优先使用@Builder替换自定义组件,提升性能。这里需要注意Builder替代自定义组件之后页面的刷新问题,因为有时候数据传的是正确的,但是UI没刷新,具体原因如下,参照按引用传递参数部分:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builder-V5#%E6%8C%89%E5%BC%95%E7%94%A8%E4%BC%A0%E9%80%92%E5%8F%82%E6%95%B0
3:自定义组件尽量不要外挂属性,减少自定义组件产生多余节点;自定义组件外挂属性之后,系统会为其创建一个默认的节点,这就产生了额外的开销
错误示例:
正确示例:
4:使用lint检测自己的模块,处理暴露出来的问题,这里既包含冗余嵌套,也包含一部分写法不规范的问题,可以按模块检测并修改
具体方法:在项目中选中具体的文件夹或者文件,右击:
5:长列表内存占用
对于长列表使用LazyForEach进行渲染,并在卡片中使用@Reusable注解,这里需要注意一点,长列表进行数据处理时我们需要复写官方的IDataSource类,在分页加载数据时要使用notifyDataAdd,而非notifyDataReload,notifyDataReload会重绘整个列表,导致内存抖动及内存占用量飙升
正确示例:
WaterFlow({ scroller: this.scroller }) {
LazyForEach(this.commonDataSource, (mCommodityData: CommodityItemData, itemGeneratorIndex: number) => {
FlowItem() {}
},
(item: CommodityItemData) => `today_${item.commodityId}`) //这里的参数不建议缺省,同时不能在加载时动态设置,必须在数据源中设置
}
错误示例,这里不能使用时间戳,会导致条目不能复用
WaterFlow({ scroller: this.scroller }) {
LazyForEach(this.commonDataSource, (mCommodityData: CommodityItemData, itemGeneratorIndex: number) => {
FlowItem() {}
},
(item: CommodityItemData) => systemDateTime.getCurrentTime() +`${item.commodityId}`) //这里的参数不建议缺省,同时不能在加载时动态设置,必须在数据源中设置
}