最近在對鴻蒙項(xiàng)目進(jìn)行性能優(yōu)化,主要調(diào)優(yōu)以下幾點(diǎn)
0:官方參考文檔如下:
https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-performance-V5
1:冗余嵌套
由于在開發(fā)之初的種種原因警儒,導(dǎo)致項(xiàng)目很多地方出現(xiàn)冗余的嵌套(示例如下),冗余嵌套會導(dǎo)致頁面繪制變慢置逻、內(nèi)存占用增加等問題
2:使用Builder替代自定義組件
當(dāng)自定義組件不涉及到狀態(tài)變量和自定義生命周期時(shí)玩讳,可以優(yōu)先使用@Builder替換自定義組件,提升性能刮萌。這里需要注意Builder替代自定義組件之后頁面的刷新問題驮配,因?yàn)橛袝r(shí)候數(shù)據(jù)傳的是正確的,但是UI沒刷新,具體原因如下壮锻,參照按引用傳遞參數(shù)部分:
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:自定義組件盡量不要外掛屬性琐旁,減少自定義組件產(chǎn)生多余節(jié)點(diǎn);自定義組件外掛屬性之后猜绣,系統(tǒng)會為其創(chuàng)建一個(gè)默認(rèn)的節(jié)點(diǎn)灰殴,這就產(chǎn)生了額外的開銷
錯(cuò)誤示例:
正確示例:
4:使用lint檢測自己的模塊,處理暴露出來的問題掰邢,這里既包含冗余嵌套牺陶,也包含一部分寫法不規(guī)范的問題,可以按模塊檢測并修改
具體方法:在項(xiàng)目中選中具體的文件夾或者文件尸变,右擊:
5:長列表內(nèi)存占用
對于長列表使用LazyForEach進(jìn)行渲染义图,并在卡片中使用@Reusable注解,這里需要注意一點(diǎn)召烂,長列表進(jìn)行數(shù)據(jù)處理時(shí)我們需要復(fù)寫官方的IDataSource類碱工,在分頁加載數(shù)據(jù)時(shí)要使用notifyDataAdd,而非notifyDataReload奏夫,notifyDataReload會重繪整個(gè)列表怕篷,導(dǎo)致內(nèi)存抖動(dòng)及內(nèi)存占用量飆升
正確示例:
WaterFlow({ scroller: this.scroller }) {
LazyForEach(this.commonDataSource, (mCommodityData: CommodityItemData, itemGeneratorIndex: number) => {
FlowItem() {}
},
(item: CommodityItemData) => `today_${item.commodityId}`) //這里的參數(shù)不建議缺省,同時(shí)不能在加載時(shí)動(dòng)態(tài)設(shè)置酗昼,必須在數(shù)據(jù)源中設(shè)置
}
錯(cuò)誤示例廊谓,這里不能使用時(shí)間戳,會導(dǎo)致條目不能復(fù)用
WaterFlow({ scroller: this.scroller }) {
LazyForEach(this.commonDataSource, (mCommodityData: CommodityItemData, itemGeneratorIndex: number) => {
FlowItem() {}
},
(item: CommodityItemData) => systemDateTime.getCurrentTime() +`${item.commodityId}`) //這里的參數(shù)不建議缺省麻削,同時(shí)不能在加載時(shí)動(dòng)態(tài)設(shè)置蒸痹,必須在數(shù)據(jù)源中設(shè)置
}