在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用List組件減小JS運行內存

HarmonyOS開發者 ? 來源:HarmonyOS開發者 ? 作者:tongshijia ? 2021-10-08 17:46 ? 次閱讀

每種編程語言都有它的內存管理機制,不同設備上可用內存不同,分配給JS引擎可用的內存范圍也不同。例如運行內存在128MB以下的輕量設備,對應JS引擎的可用內存范圍為48-64KB。本文也將以此類設備為例進行分析。

當整個頁面渲染比較復雜時,JS運行內存峰值就可能會超過JS引擎分配到的最大可用內存,導致頁面無法渲染。

List組件是JS UI框架下最基本的容器組件之一,提供了一系列相同寬度的列表項。在應用開發過程中,經常會使用List容器組件來呈現大量的數據。所以,在List組件應用的開發過程中,開發者應充分考慮內存優化問題。

本期,我們將通過List組件開發一個通訊錄頁面,并采用list+for的方案對整個頁面進行優化,達到減小JS運行內存的目的。

一、代碼實現

如下所示,是一張簡單的通訊錄頁面,包含了姓名、電話及對應圖片。下面將通過兩種實現方式來對比代碼性能。

方法一:直接書寫對應的組件頁面

使用HML直接撰寫整個組件頁面的內容,代碼如下:

《div class=“container”》 《list class=“list”》 《list-item class=“list-item”》 《image class=“image” src=“/common/1.png”》《/image》 《div class=“info”》 《text class=“text”》張三《/text》 《marquee class=“detail”》電話:+86 130XXXXXXXX《/marquee》 《/div》 《/list-item》 《list-item class=“list-item”》

《image class=“image” src=“/common/1.png”》《/image》 《div class=“info”》 《text class=“text”》李四《/text》 《marquee class=“detail”》電話:027-6128XXXX《/marquee》

《/div》 《/list-item》 《list-item class=“list-item”》 《image class=“image” src=“/common/1.png”》《/image》

《div class=“info”》 《text class=“text”》王五《/text》 《marquee class=“detail”》電話:+86 150xxxxxx《/marquee》 《/div》 《/list-item》 《list-item class=“list-item”》 《image class=“image” src=“/common/1.png”》《/image》 《div class=“info”》

《text class=“text”》小明《/text》 《marquee class=“detail”》電話:+86 130XXXXXXXX《/marquee》

《/div》 《/list-item》 《list-item class=“list-item”》 《image class=“image” src=“/common/2.png”》《/image》 《div class=“info”》 《text class=“text”》小紅《/text》

《marquee class=“detail”》電話:+86 180XXXX 《/marquee》 《/div》 《/list-item》 。。. 《/list》 《input value=“非for” on:click=“changeNextPage” class=“button”》《/input》《/div》

方法二:通過for指令來書寫對應的組件頁面

針對方法一中的實現,采用for指令來改進,使對應頁面更簡潔,對應修改后代碼如下:

《div class=“container”》 《list class=“list” on:scrollend=“changeNextPage”》 《list-item class=“list-item” for = “{{listData}}”》 《image class = “image” src = “/common/{{$item.src}}”》《/image》 《div class = “info”》 《text class=“text”》{{$item.name}}《/text》

《marquee class = “detail”》電話: {{$item.phone}}《/marquee》 《/div》 《/list-item》 《/list》《/div》

對應的for指令的渲染數組代碼如下:

export default { data: { listData:[] }, onInit() { for (var i = 0; i 《 10; i++) { this.listData.push({‘name’:‘張三’, src :‘1.png’, phone:“+86 130XXXXXX”}); this.listData.push({‘name’:‘李四’, src :‘2.png’, phone:“027-6128XXXX”});

this.listData.push({‘name’:‘王五’, src :‘1.png’, phone:“+ 86 150XXXXXX”}); this.listData.push({‘name’:‘小明’, src :‘1.png’, phone:‘+86 130XXXXXX’}); this.listData.push({‘name’:‘小紅’, src :‘2.png’, phone:‘+86 180XXXX’}); } }}

二、性能測試

這里,我們針對不同的item數量,分別測試了以上兩種實現方式的JS運行性能,JS運行內存與JS運行內存峰值如下圖所示:

88e90044-233d-11ec-82a8-dac502259ad0.png

圖2 兩種方法的內存占用

由上表測試數據可以看出,采用方法二進行渲染,JS運行內存會出現比較大的浮動。但是使用方法一,對應的JS運行內存基本保持不變,這種差異是由兩種不同的頁面加載渲染機制造成的。

方法一的加載機制:對整個頁面一次性全部進行加載,在加載完成后,會對List組件頁面占用的JS運行內存進行釋放。頁面后續滑動,并不會觸發組件的解析,從而不會影響JS運行時內存數據。

方法二的加載機制:每次滑動屏幕會加載當前顯示頁面以及緩存部分的item,超出屏幕之外的item會對其占用的JS內存資源進行回收。當List組件頁面下滑到新的item時會重新創建請求,這種情況下會降低一部分的滑動性能,但是可以實現按需加載,降低JS運行內存峰值。

三、優缺點對比

方法一的優缺點:

優點:首次頁面顯示成功后,JS運行內存比較穩定,不會出現后續滑動崩潰的問題,且穩定顯示后占用的JS運行內存較小。

缺點:由于頁面會一次性全部進行解析,在解析比較復雜的頁面時,會對JS運行內存峰值造成比較大的壓力,甚至會導致對應的頁面無法啟動。

方法二的優缺點:

優點:

1. 在頁面啟動時,只對顯示部分進行加載,因此可以降低頁面啟動時JS運行內存。

2. 由于整個頁面始終只保持對顯示界面的元素進行渲染。因此,針對稍復雜的界面,相較于方法一JS運行內存峰值更小。

缺點:

1. List組件的內容,需要通過$item進行訪問, item顯示時會創建對應的數據監聽對象來檢測數據的變化,比如上述界面中,一個item會創建3個數據監聽,list中進行繪制的item的數量為5,因此會創建15個數據監聽,從而增加 15 * 200B(單個字節) = 3000B的數據監聽開銷。

2. 隨著list組件向下滑動,會增加數組監聽占用的內存,從而增加對應的JS運行內存。因此使用方法二,JS運行內存會一直上漲,直到最后一個item渲染。

四、使用建議

針對上述表現,我們總結了如下使用場景供開發者參考:

88e90044-233d-11ec-82a8-dac502259ad0.png

圖3 使用建議

總而言之,采用方法二開發List組件可以降低JS運行內存峰值,但是會增加JS運行時內存。當頁面比較簡單,item數量低于20個,建議采用方法一。當頁面item超過20個,或者頁面占用JS內存峰值比較大,建議采用方法二。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3685

    瀏覽量

    94921
  • JS
    JS
    +關注

    關注

    0

    文章

    78

    瀏覽量

    18403
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70306

原文標題:JS UI框架下,List組件運行時的內存優化

文章出處:【微信號:HarmonyOS_Dev,微信公眾號:HarmonyOS開發者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    HarmonyOS優化應用內存占用問題性能優化一

    一、 概述 用戶功能的不斷增強,應用越來越復雜,占用的內存也在不斷膨脹,而內存作為系統的稀缺資源比較有限,當應用程序占用過多內存時,系統可能會頻繁進行內存回收和重新分配,導致應用程序的
    發表于 05-21 11:27

    創建列表 (List) 介紹,一起來看看是做什么的

    應用程序中的常見要求(如通訊錄、音樂列表、購物清單等)。 開發布局 設置主軸方向 List組件主軸默認是垂直方向,即默認情況下不需要手動設置List方向,就可以構建一個垂直滾動列表。 若是水平滾動列表
    發表于 04-30 07:06

    Demo示例: List的使用

    List 列表包含一系列相同寬度的列表項。適合連續、多行呈現同類數據,例如圖片和文本。 子組件 僅支持ListItem、ListItemGroup子組件。 常用接口 List(v
    發表于 04-28 06:49

    Bun 1.2震撼發布:全力挑戰Node.js生態的JavaScript運行時新星

    方面取得的突破性進展。 Bun 團隊改變了此前被動修復問題的策略,轉而主動運行 Node.js 的測試套件來提升
    的頭像 發表于 01-24 10:42 ?642次閱讀
    Bun 1.2震撼發布:全力挑戰Node.<b class='flag-5'>js</b>生態的JavaScript<b class='flag-5'>運行</b>時新星

    使用 Memtester 對華為云 X 實例進行內存性能測試

    整體的穩定性和響應速度有著舉足輕重的影響。無論是數據庫應用、虛擬化技術,還是大數據處理,內存帶寬和延遲都直接影響著應用的運行效率。因此,了解云服務
    的頭像 發表于 12-30 14:52 ?437次閱讀
    使用 Memtester 對華為云 X 實例進<b class='flag-5'>行內存</b>性能測試

    Node.js小科普和Node.js安裝常見管理工具

    Node.js是一個JavaScript的運行環境,用來執行JavaScript代碼。 為什么會出現這么一個運行環境呢,從JavaScript研發初衷可以看出它是為了運行在瀏覽器中的,
    的頭像 發表于 11-23 15:37 ?371次閱讀
    Node.<b class='flag-5'>js</b>小科普和Node.<b class='flag-5'>js</b>安裝常見管理工具

    前端總線與內存頻率怎么配

    前端總線(FSB)與內存頻率的配合是確保計算機系統穩定運行并發揮最佳性能的關鍵因素之一。以下是對前端總線與內存頻率配合關系的介紹: 一、前端總線與內存頻率的基本概念 前端總線 :前端總
    的頭像 發表于 10-12 09:10 ?818次閱讀

    JS實現簡單的屏幕錄像機

    作者:京東保險 張潔 本文將介紹如何用JS實現簡單的屏幕錄像機。 一、錄制準備 創建一個按鈕 ? Start recording ? 書寫JavaScript ? var
    的頭像 發表于 10-09 15:27 ?368次閱讀

    鴻蒙跨端實踐-JS虛擬機架構實現

    在Roma跨端方案中,JS虛擬機是框架的核心,負責執行動態化的JS代碼。在Android平臺采用了基于V8的J2V8,iOS平臺則使用了系統自帶的JSCore,而在HarmonyOS中,由于業界無
    的頭像 發表于 09-30 14:42 ?2900次閱讀
    鴻蒙跨端實踐-<b class='flag-5'>JS</b>虛擬機架構實現

    推薦一個支持js的嵌入式設備開發平臺

    可以通過vscode開發js,實時推送js代碼到設備里運行,無需編譯,支持屏幕,感興趣的可以看看 https://github.com/duoxianwulian/dxdop 提供很多js
    發表于 09-04 14:04

    鴻蒙ArkTS容器組件:Tabs

    通過頁簽進行內容視圖切換的容器組件,每個頁簽對應一個內容視圖。
    的頭像 發表于 07-15 09:48 ?1544次閱讀
    鴻蒙ArkTS容器<b class='flag-5'>組件</b>:Tabs

    鴻蒙ArkTS容器組件:ListItemGroup

    組件用來展示列表item分組,寬度默認充滿[List]組件,必須配合List組件來使用。
    的頭像 發表于 07-10 09:20 ?1214次閱讀
    鴻蒙ArkTS容器<b class='flag-5'>組件</b>:ListItemGroup

    鴻蒙ArkTS聲明式組件:ScrollBar

    滾動條組件ScrollBar,用于配合可滾動組件使用,如List、Grid、Scroll。
    的頭像 發表于 07-01 15:52 ?932次閱讀
    鴻蒙ArkTS聲明式<b class='flag-5'>組件</b>:ScrollBar

    鴻蒙ArkTS聲明式組件:Span

    作為Text組件的子組件,用于顯示行內文本的組件
    的頭像 發表于 07-01 09:14 ?774次閱讀
    鴻蒙ArkTS聲明式<b class='flag-5'>組件</b>:Span

    Jtti:新加坡云服務器運行內存和存儲內存有何區別?

    新加坡云服務器 的運行內存(RAM)和存儲內存在功能、速度、用途等方面有所區別。以下是它們的主要差異: 一、功能: 運行內存(RAM):主要用于臨時存儲正在運行的程序和數據,以便CPU
    的頭像 發表于 06-25 14:26 ?787次閱讀
    主站蜘蛛池模板: 日韩精品午夜 | 天天干天天操天天摸 | 国产免费色视频 | 亚洲阿v天堂2018在线观看 | 2022第二三四天堂网 | 91一区二区三区四区五区 | 美女好紧好大好爽12p | 777奇米影视一区二区三区 | 四虎影院永久 | www.毛片com| 午夜视频网址 | 99视频全部免费 | 亚洲精品视频区 | 久久777国产线看观看精品卜 | 日本欧美一区二区三区免费不卡 | 天天夜干| 日本免费一区视频 | 欧美黑人巨大xxx猛交 | 国产精品成人一区二区三区 | 三级在线网址 | www婷婷| 在线视频一二三区 | 午夜影院啊啊啊 | 久久亚洲免费视频 | 五月天情网 | 特别黄的免费视频大片 | 中文字幕va | 在线看片福利 | 狠狠狠狼鲁欧美综合网免费 | 有码视频在线观看 | 高颜值美女啪啪 | 女人张腿让男桶免费视频网站 | 久久综合九色综合欧美狠狠 | 老师你好滑下面好湿h | 日本高清一区二区三区不卡免费 | 欧日韩美香蕉在线观看 | 免费免播放器在线视频观看 | 天天天天做夜夜夜夜做 | 免费网站你懂得 | 黄色a∨| 69ww免费视频播放器 |