【鴻蒙開發】性能優化

語言層面的優化

使用明確的數據類型,避免使用模糊的數據類型,例如ESObject。

使用AOT模式

AOT就是提前編譯,將字節碼提前編譯成機器碼,這樣可以充分優化,從而加快執行速度。

未啟用AOT時,一邊運行一邊進行機器碼的生成。
開啟AOT后,設備能直接運行已經提前優化過的機器碼,大大提高執行速度。

應用啟動優化

應用階段劃分:

  1. 第一階段:應用進程的創建和初始化
  2. 第二階段:App和Ability的初始化
  3. 第三階段:Ability生命周期
  4. 第四階段:加載繪制首頁

每個啟動階段的優化策略:

  1. 第一階段優化:設置合適分辨率的應用圖標
  2. 第二階段優化:減少首頁Ability或者Page中import的模塊數量,不是首頁必須的模塊可以使用動態異步加載,如await import(‘Page’)
  3. 第三階段優化:Ability生命周期方法中,對于耗時操作進行異步處理
  4. 第四階段優化:延遲加載,減少不必要的首頁內容。例如使用LazyForEach替換ForEach

LazyForEach替換ForEach

LazyForEach是一種懶加載的模式,在循環繪制組件時能顯著提升頁面的加載速度。結合cacheCount方法能控制列表的緩存數量,實現更優的滑動體驗。

減少丟幀卡頓

  • 避免在主線程上執行耗時操作:將耗時操作放在TaskPool或者Worker等后臺進程中執行,從而防止主線程負載過高。
  • 減少渲染進程的冗余開銷:使用資源圖代替繪制、合理使用renderGroup、尺寸位置使用整數。
  • 減少試圖嵌套層級
  • 組件復用
  • 控制狀態變量關聯的組件數量
  • 在對象上謹慎使用狀態變量進行關聯

優化案例

組件轉場動畫推薦使用transition,不推薦使用animateTo方法。

減少animateTo方法的使用數量,一起變更比分開變更更加高效。

多次animateTo時統一更新狀態變量,減少多次更新狀態變量導致的開銷。

使用RenderGroup可以緩存組件及其子組件的繪制,從而降低繪制負載優化渲染性能。適合沒狀態綁定的不變組件,如果有狀態綁定,當狀態變化時緩存就是失效了。

使用@Reusable標記復用組件,適用頻繁創建和銷毀的組件,或反復切換條件渲染的控制分支且控制分支中的組件子樹結構相同。

不推薦使用更新單個狀態變量的形式控制多個組件的更新(命令式);
推薦使用狀態變量和組件一對一綁定的方式,以數據變更驅動組件的刷新(聲明式);

合理控制狀態變量更新范圍,避免關聯刷新大量組件。關聯變化較大的狀態變量可以通過對象組合成一個狀態變量,針對渲染成本較高的組件建議使用獨立的狀態變量進行關聯。

理解@Prop和@ObjectLink的區別:@Prop是深拷貝關聯,@ObjectLink是淺拷貝關聯,因此優先推薦使用@ObjectLink的方式,從而減少系統內存開銷。

性能調優工具

Profile調優工具

合理使用布局

組件布局屬性(width、height、padding、margin等)大小發生變化會導致受影響的整個組件樹重新更新,而非布局屬性(Color、BackgroundColor、opacity等)的變化僅影響組件自身。這一點跟Web界面的渲染機制類似,因此我們在更新界面元素時,盡量減少布局屬性的變化,防止影響整個組件的重新渲染。如果某些組件需要經常變化,可以將組件置于一個固定布局(這個布局內,布局屬性固定)內,將影響固定在這個固定布局內部,從而減少對其他組件的影響。

精簡節點數

  • 移除冗余節點
  • 使用扁平化布局減少節點數

在這里插入圖片描述

扁平化方法:通過將嵌套結構攤開,減少中間節點,從而提升渲染速度。常用方法有:

  • 通過RelativeContainer 相對布局實現扁平化
  • 通過錨點定位實現扁平化
  • 通過Grid布局實現扁平化

利用布局邊界減少計算

對于能夠在初期給定寬高的組件,在進行UI描述時盡量給定寬高數值,能夠減少由于容器尺寸變化造成的重新測算過程的性能。

合理控制元素的顯示與隱藏

首次繪制時,if會根據是否為true決定是否創建組件,而visibility組件無論是否顯示都要創建組件。
再次顯示時,if由于首次沒有創建組件,再次顯示時會創建組件,并經過Measure和Layout階段。而visibility組件已經創建過,只需要經過Measure和Layout階段。

  • 只有初始的一次渲染或者交互次數很少的情況下,建議使用if條件判斷來控制元素的顯示與隱藏效果,對于內存有較大提升。
  • 如果會頻繁響應顯示與隱藏的交互效果,建議使用切換Visibility.None和Visibility.Visible來控制元素顯示與隱藏,提高性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905657.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905657.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905657.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

群暉NAS部署PlaylistDL音樂下載器結合cpolar搭建私有云音樂庫

文章目錄 前言1.關于PlaylistDL音樂下載器2.Docker部署3.PlaylistDL簡單使用4.群暉安裝Cpolar工具5.創建PlaylistDL音樂下載器的公網地址6.配置固定公網地址總結 前言 各位小伙伴們,你們是不是經常為了聽幾首歌而開通各種平臺的VIP?或者為了下載無損音質…

REST架構風格介紹

一.REST(表述性狀態轉移) 1.定義 REST(Representational State Transfer)是由 Roy Fielding 在 2000 年提出的一種軟件架構風格,用于設計網絡應用的通信模式。它基于 HTTP 協議,強調通過統一的接口&#…

計算機視覺----基于錨點的車道線檢測、從Line-CNN到CLRNet到CLRKDNet 本文所提算法Line-CNN 后續會更新以下全部算法

本文所提算法如下: 敘述按時間順序 你也可以把本文當作快速閱讀這幾篇文獻的一個途徑 所有重要的部分我都已經標注并弄懂其原理 方便自己也是方便大家 Line-CNN:基于線提議單元的端到端交通線檢測 摘要 交通線檢測是一項基礎且具有挑戰性的任務。以往的…

一.android Studio開發系統應用——導入TvSettings源碼

目標 最終效果如上,實現在AS中編輯源碼后一鍵在真機中運行。達到和普通應用開發一樣的調試和編碼過程。這種方法可以大幅度提升開發速度,但是導入過程確實相對繁瑣和消耗時間。適合需要精細或者頻繁改動的系統app源碼。 一、新建項目 包名:com.android.tv.settings 版本:…

20250515讓飛凌的OK3588-C的核心板在Linux R4下適配以太網RTL8211F-CG為4線百兆時的接線圖

20250515讓飛凌的OK3588-C的核心板在Linux R4下適配以太網RTL8211F-CG為4線百兆時的接線圖 2025/5/15 20:19 緣起:以前做的網線找不到了,那就再來一條吧。 引腳定義要從頭來過?還好找到了一條。 開干! 萬用表一對/點,幾…

【技術原理】Linux 文件時間屬性詳解:Access、Modify、Change 的區別與聯系

在 Linux 系統中,每個文件都有三個核心時間屬性:Access Time (atime)、Modify Time (mtime) 和 Change Time (ctime)。它們分別記錄文件不同維度的變更信息,以下是具體區別與聯系: 一、定義與觸發條件 時間屬性定義觸發條件示例A…

乘法口訣練習神器

請你利用python語言開發一個“乘法口訣練習神器”,主要輔助小學生練習乘法口訣,主要功能如下: 1. 能夠隨機循環出10道題,可以是乘法或者是除法。如果是乘法,確保兩個因數都是1-9之間的整數;如果是除法&…

[c語言日寄]數據結構:棧

【作者主頁】siy2333 【專欄介紹】?c語言日寄?:這是一個專注于C語言刷題的專欄,精選題目,搭配詳細題解、拓展算法。從基礎語法到復雜算法,題目涉及的知識點全面覆蓋,助力你系統提升。無論你是初學者,還是…

磁盤I/O瓶頸排查:面試通關“三部曲”心法

想象一下,你就是線上系統的“交通調度總指揮”,服務器的磁盤是所有數據進出的“核心樞紐港口”。當這個“港口”突然擁堵不堪,卡車(數據請求)排起長龍,進不去也出不來,整個系統的“物流”&#…

基于大模型預測胃穿孔預測與圍手術期管理系統技術方案

目錄 1. 系統架構模塊2. 關鍵算法實現2.1 術前預測模型(Transformer多模態融合)2.2 術中實時分析(在線學習LSTM)3. 模塊流程圖(Mermaid)3.1 數據預處理系統3.2 術前預測系統3.3 術中實時分析系統4. 技術驗證模塊4.1 模型可解釋性驗證4.2 邊緣計算部署架構1. 系統架構模塊…

C++:類和對象4

一,日期類實現 學習建議: 對于計算機學習來說,調試十分重要,所以在日常學習中一定要加大代碼練習,刷代碼題和課后自己敲出課上代碼例題,注意不要去對比正確代碼或者網上找正確代碼直接使用,一…

大數據架構選型分析

選擇依據 1.業務需求與技術要求 用戶需要根據自己的業務需求來選擇架構,如果業務對于Hadoop、Spark、Strom等關鍵技術有強制性依賴,選擇Lambda架構可能較為合適;如果處理數據偏好于流式計算,又依賴Flink計算引擎,那么…

Trae 插件 Builder 模式:從 0 到 1 開發天氣查詢小程序,解鎖 AI 編程新體驗

在軟件開發領域,效率與創新始終是開發者追求的核心目標。Trae 插件(原 MarsCode 編程助手)Builder 模式的全面上線,無疑為開發者帶來了全新的解決方案。它不僅同時支持 VS Code、JetBrains IDEs 等主流開發環境,還能讓…

SSM項目集成redis、Linux服務器安裝redis

在SSM(Spring Spring MVC MyBatis)項目中引入Redis主要分為以下步驟,確保配置正確并能在業務中靈活使用: 1. 添加Redis依賴?? 在Maven的pom.xml中添加Spring Data Redis和Jedis(或Lettuce)依賴&#…

【Redis】壓縮列表

目錄 1、背景2、壓縮列表【1】底層結構【2】特性【3】優缺點 1、背景 ziplist(壓縮列表)是redis中一種特殊編碼的雙向鏈表數據結構,主要用于存儲小型列表和哈希表。它通過緊湊的內存布局和特殊的編碼方式來節省內存空間。 2、壓縮列表 【1…

LocalDateTime類型的時間在前端頁面不顯示或者修改數據時因為LocalDateTime導致無法修改,解決方案

1.數據庫中的時間數據,在控制臺可以正常返回,在前端無法返回,即顯示空白,如下圖所示: 2.這種問題一般時由于數據庫和我們實體類的名稱不一致引起的,我們數據庫一般采用_的方式命名,但是在Java中我們一般采用…

Spring框架核心技術深度解析:JDBC模板、模擬轉賬與事務管理

一、JDBC模板技術:簡化數據庫操作 在傳統JDBC開發中,繁瑣的資源管理和重復代碼一直是開發者的痛點。Spring框架提供的 JDBC模板(JdbcTemplate) 徹底改變了這一現狀,它通過封裝底層JDBC操作,讓開發者僅需關注SQL邏輯&a…

Modern C++(一)基本概念

1、基本概念 1.1、注釋 注釋在翻譯階段3會被替換為單個空白字符從程序中移除 1.2、名字與標識符 標識符是一個由數字、下劃線、大小寫字符組成的任意長度序列。有效的標識符首個字符必須是以A-Z、a-z、下劃線開頭,。有效的標識符其他字符可以是0-9、A-Z、a-z、下…

STM32的TIMx中Prescaler和ClockDivision的區別

Prescaler預分頻,以筆者目前的學習程度來說,這個參數,一般來說是對主時鐘進行分頻后的計數器時鐘。這個預分頻后的時鐘主要是用于的計數的。 這個主時鐘,對于時基單元來說可以是內部時鐘,也可以是外部時鐘。一般來說我…

前端性能指標及優化策略——從加載、渲染和交互階段分別解讀詳解并以Webpack+Vue項目為例進行解讀

按照加載階段、渲染階段和交互階段三個維度進行系統性闡述: 在現代 Web 開發中,性能不再是錦上添花,而是決定用戶體驗與業務成敗的關鍵因素。為了全面監控與優化網頁性能,我們可以將性能指標劃分為加載階段、渲染階段、和交互階段…