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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用List組件減小JS運(yùn)行內(nèi)存

HarmonyOS開(kāi)發(fā)者 ? 來(lái)源:HarmonyOS開(kāi)發(fā)者 ? 作者:tongshijia ? 2021-10-08 17:46 ? 次閱讀

每種編程語(yǔ)言都有它的內(nèi)存管理機(jī)制,不同設(shè)備上可用內(nèi)存不同,分配給JS引擎可用的內(nèi)存范圍也不同。例如運(yùn)行內(nèi)存在128MB以下的輕量設(shè)備,對(duì)應(yīng)JS引擎的可用內(nèi)存范圍為48-64KB。本文也將以此類(lèi)設(shè)備為例進(jìn)行分析。

當(dāng)整個(gè)頁(yè)面渲染比較復(fù)雜時(shí),JS運(yùn)行內(nèi)存峰值就可能會(huì)超過(guò)JS引擎分配到的最大可用內(nèi)存,導(dǎo)致頁(yè)面無(wú)法渲染。

List組件是JS UI框架下最基本的容器組件之一,提供了一系列相同寬度的列表項(xiàng)。在應(yīng)用開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)使用List容器組件來(lái)呈現(xiàn)大量的數(shù)據(jù)。所以,在List組件應(yīng)用的開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)者應(yīng)充分考慮內(nèi)存優(yōu)化問(wèn)題。

本期,我們將通過(guò)List組件開(kāi)發(fā)一個(gè)通訊錄頁(yè)面,并采用list+for的方案對(duì)整個(gè)頁(yè)面進(jìn)行優(yōu)化,達(dá)到減小JS運(yùn)行內(nèi)存的目的。

一、代碼實(shí)現(xiàn)

如下所示,是一張簡(jiǎn)單的通訊錄頁(yè)面,包含了姓名、電話及對(duì)應(yīng)圖片。下面將通過(guò)兩種實(shí)現(xiàn)方式來(lái)對(duì)比代碼性能。

方法一:直接書(shū)寫(xiě)對(duì)應(yīng)的組件頁(yè)面

使用HML直接撰寫(xiě)整個(gè)組件頁(yè)面的內(nèi)容,代碼如下:

《div class=“container”》 《list class=“l(fā)ist”》 《list-item class=“l(fā)ist-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=“l(fā)ist-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=“l(fā)ist-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=“l(fā)ist-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=“l(fā)ist-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》

方法二:通過(guò)for指令來(lái)書(shū)寫(xiě)對(duì)應(yīng)的組件頁(yè)面

針對(duì)方法一中的實(shí)現(xiàn),采用for指令來(lái)改進(jìn),使對(duì)應(yīng)頁(yè)面更簡(jiǎn)潔,對(duì)應(yīng)修改后代碼如下:

《div class=“container”》 《list class=“l(fā)ist” on:scrollend=“changeNextPage”》 《list-item class=“l(fā)ist-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》

對(duì)應(yīng)的for指令的渲染數(shù)組代碼如下:

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’}); } }}

二、性能測(cè)試

這里,我們針對(duì)不同的item數(shù)量,分別測(cè)試了以上兩種實(shí)現(xiàn)方式的JS運(yùn)行性能,JS運(yùn)行內(nèi)存與JS運(yùn)行內(nèi)存峰值如下圖所示:

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

圖2 兩種方法的內(nèi)存占用

由上表測(cè)試數(shù)據(jù)可以看出,采用方法二進(jìn)行渲染,JS運(yùn)行內(nèi)存會(huì)出現(xiàn)比較大的浮動(dòng)。但是使用方法一,對(duì)應(yīng)的JS運(yùn)行內(nèi)存基本保持不變,這種差異是由兩種不同的頁(yè)面加載渲染機(jī)制造成的。

方法一的加載機(jī)制:對(duì)整個(gè)頁(yè)面一次性全部進(jìn)行加載,在加載完成后,會(huì)對(duì)List組件頁(yè)面占用的JS運(yùn)行內(nèi)存進(jìn)行釋放。頁(yè)面后續(xù)滑動(dòng),并不會(huì)觸發(fā)組件的解析,從而不會(huì)影響JS運(yùn)行時(shí)內(nèi)存數(shù)據(jù)。

方法二的加載機(jī)制:每次滑動(dòng)屏幕會(huì)加載當(dāng)前顯示頁(yè)面以及緩存部分的item,超出屏幕之外的item會(huì)對(duì)其占用的JS內(nèi)存資源進(jìn)行回收。當(dāng)List組件頁(yè)面下滑到新的item時(shí)會(huì)重新創(chuàng)建請(qǐng)求,這種情況下會(huì)降低一部分的滑動(dòng)性能,但是可以實(shí)現(xiàn)按需加載,降低JS運(yùn)行內(nèi)存峰值。

三、優(yōu)缺點(diǎn)對(duì)比

方法一的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):首次頁(yè)面顯示成功后,JS運(yùn)行內(nèi)存比較穩(wěn)定,不會(huì)出現(xiàn)后續(xù)滑動(dòng)崩潰的問(wèn)題,且穩(wěn)定顯示后占用的JS運(yùn)行內(nèi)存較小。

缺點(diǎn):由于頁(yè)面會(huì)一次性全部進(jìn)行解析,在解析比較復(fù)雜的頁(yè)面時(shí),會(huì)對(duì)JS運(yùn)行內(nèi)存峰值造成比較大的壓力,甚至?xí)?dǎo)致對(duì)應(yīng)的頁(yè)面無(wú)法啟動(dòng)。

方法二的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

1. 在頁(yè)面啟動(dòng)時(shí),只對(duì)顯示部分進(jìn)行加載,因此可以降低頁(yè)面啟動(dòng)時(shí)JS運(yùn)行內(nèi)存。

2. 由于整個(gè)頁(yè)面始終只保持對(duì)顯示界面的元素進(jìn)行渲染。因此,針對(duì)稍復(fù)雜的界面,相較于方法一JS運(yùn)行內(nèi)存峰值更小。

缺點(diǎn):

1. List組件的內(nèi)容,需要通過(guò)$item進(jìn)行訪問(wèn), item顯示時(shí)會(huì)創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)監(jiān)聽(tīng)對(duì)象來(lái)檢測(cè)數(shù)據(jù)的變化,比如上述界面中,一個(gè)item會(huì)創(chuàng)建3個(gè)數(shù)據(jù)監(jiān)聽(tīng),list中進(jìn)行繪制的item的數(shù)量為5,因此會(huì)創(chuàng)建15個(gè)數(shù)據(jù)監(jiān)聽(tīng),從而增加 15 * 200B(單個(gè)字節(jié)) = 3000B的數(shù)據(jù)監(jiān)聽(tīng)開(kāi)銷(xiāo)。

2. 隨著list組件向下滑動(dòng),會(huì)增加數(shù)組監(jiān)聽(tīng)占用的內(nèi)存,從而增加對(duì)應(yīng)的JS運(yùn)行內(nèi)存。因此使用方法二,JS運(yùn)行內(nèi)存會(huì)一直上漲,直到最后一個(gè)item渲染。

四、使用建議

針對(duì)上述表現(xiàn),我們總結(jié)了如下使用場(chǎng)景供開(kāi)發(fā)者參考:

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

圖3 使用建議

總而言之,采用方法二開(kāi)發(fā)List組件可以降低JS運(yùn)行內(nèi)存峰值,但是會(huì)增加JS運(yùn)行時(shí)內(nèi)存。當(dāng)頁(yè)面比較簡(jiǎn)單,item數(shù)量低于20個(gè),建議采用方法一。當(dāng)頁(yè)面item超過(guò)20個(gè),或者頁(yè)面占用JS內(nèi)存峰值比較大,建議采用方法二。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3634

    瀏覽量

    93855
  • JS
    JS
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    18135
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4809

    瀏覽量

    68816

原文標(biāo)題:JS UI框架下,List組件運(yùn)行時(shí)的內(nèi)存優(yōu)化

文章出處:【微信號(hào):HarmonyOS_Dev,微信公眾號(hào):HarmonyOS開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Node.js小科普和Node.js安裝常見(jiàn)管理工具

    Node.js是一個(gè)JavaScript的運(yùn)行環(huán)境,用來(lái)執(zhí)行JavaScript代碼。 為什么會(huì)出現(xiàn)這么一個(gè)運(yùn)行環(huán)境呢,從JavaScript研發(fā)初衷可以看出它是為了運(yùn)行在瀏覽器中的,
    的頭像 發(fā)表于 11-23 15:37 ?141次閱讀
    Node.<b class='flag-5'>js</b>小科普和Node.<b class='flag-5'>js</b>安裝常見(jiàn)管理工具

    鴻蒙ArkTS容器組件:Tabs

    通過(guò)頁(yè)簽進(jìn)行內(nèi)容視圖切換的容器組件,每個(gè)頁(yè)簽對(duì)應(yīng)一個(gè)內(nèi)容視圖。
    的頭像 發(fā)表于 07-15 09:48 ?880次閱讀
    鴻蒙ArkTS容器<b class='flag-5'>組件</b>:Tabs

    鴻蒙ArkTS容器組件:ListItemGroup

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

    鴻蒙ArkTS聲明式組件:ScrollBar

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

    鴻蒙ArkTS聲明式組件:Span

    作為T(mén)ext組件的子組件,用于顯示行內(nèi)文本的組件。
    的頭像 發(fā)表于 07-01 09:14 ?491次閱讀
    鴻蒙ArkTS聲明式<b class='flag-5'>組件</b>:Span

    Jtti:新加坡云服務(wù)器運(yùn)行內(nèi)存和存儲(chǔ)內(nèi)存有何區(qū)別?

    新加坡云服務(wù)器 的運(yùn)行內(nèi)存(RAM)和存儲(chǔ)內(nèi)存在功能、速度、用途等方面有所區(qū)別。以下是它們的主要差異: 一、功能: 運(yùn)行內(nèi)存(RAM):主要用于臨時(shí)存儲(chǔ)正在運(yùn)行的程序和數(shù)據(jù),以便CPU
    的頭像 發(fā)表于 06-25 14:26 ?521次閱讀

    STM32MP157F-DK2配置的4G DDR3L,為什么輸入free指令的時(shí)候,顯示只有300M的運(yùn)行內(nèi)存?

    STM32MP157F-DK2配置的 4G DDR3L,但為什么輸入free指令的時(shí)候,顯示只有300M的運(yùn)行內(nèi)存
    發(fā)表于 05-30 06:22

    HarmonyOS開(kāi)發(fā)案例:【使用List組件實(shí)現(xiàn)設(shè)置項(xiàng)】

    使用List組件、Toggle組件以及Router接口,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的設(shè)置頁(yè),點(diǎn)擊將跳轉(zhuǎn)到對(duì)應(yīng)的詳細(xì)設(shè)置頁(yè)面。
    的頭像 發(fā)表于 05-10 17:01 ?969次閱讀
    HarmonyOS開(kāi)發(fā)案例:【使用<b class='flag-5'>List</b><b class='flag-5'>組件</b>實(shí)現(xiàn)設(shè)置項(xiàng)】

    OpenHarmony語(yǔ)言基礎(chǔ)類(lèi)庫(kù)【@ohos.util.List (線性容器List)】

    List底層通過(guò)單向鏈表實(shí)現(xiàn),每個(gè)節(jié)點(diǎn)有一個(gè)指向后一個(gè)元素的引用。當(dāng)需要查詢(xún)?cè)貢r(shí),必須從頭遍歷,插入、刪除效率高,查詢(xún)效率低。List允許元素為null。
    的頭像 發(fā)表于 05-10 16:57 ?767次閱讀
    OpenHarmony語(yǔ)言基礎(chǔ)類(lèi)庫(kù)【@ohos.util.<b class='flag-5'>List</b> (線性容器<b class='flag-5'>List</b>)】

    HarmonyOS開(kāi)發(fā)案例:【使用List組件實(shí)現(xiàn)商品列表】

    OpenHarmony ArkTS提供了豐富的接口和組件,開(kāi)發(fā)者可以根據(jù)實(shí)際場(chǎng)景和開(kāi)發(fā)需求,選用不同的組件和接口。
    的頭像 發(fā)表于 05-10 16:41 ?1389次閱讀
    HarmonyOS開(kāi)發(fā)案例:【使用<b class='flag-5'>List</b><b class='flag-5'>組件</b>實(shí)現(xiàn)商品列表】

    OpenHarmony實(shí)戰(zhàn)開(kāi)發(fā)-list開(kāi)發(fā)指導(dǎo)

    list是用來(lái)顯示列表的組件,包含一系列相同寬度的列表項(xiàng),適合連續(xù)、多行地呈現(xiàn)同類(lèi)數(shù)據(jù)。 創(chuàng)建list組件 在pages/index目錄下的hml文件中創(chuàng)建一個(gè)
    發(fā)表于 04-29 14:44

    stm32h7想把sarm1作為運(yùn)行內(nèi)存,但上電會(huì)進(jìn)入hard fault是哪里的問(wèn)題?

    因項(xiàng)目需要,想把sarm1(0x30000000-0x3000ffff)作為運(yùn)行內(nèi)存,但上電會(huì)進(jìn)入hard fault, 請(qǐng)問(wèn)有哪大哥這樣設(shè)置是成功的
    發(fā)表于 04-17 07:20

    STM32如何用HAL庫(kù)進(jìn)行內(nèi)核復(fù)位?

    STM32如何用HAL庫(kù)進(jìn)行內(nèi)核復(fù)位 普通的系統(tǒng)復(fù)位函數(shù)如下: / ** 簡(jiǎn)短的系統(tǒng)重置 詳細(xì)信息發(fā)起系統(tǒng)重置請(qǐng)求以重置MCU。 * / __STATIC_INLINE void
    發(fā)表于 04-11 06:49

    保障BMS電池管理系統(tǒng)穩(wěn)定運(yùn)行的關(guān)鍵組件

    保障BMS電池管理系統(tǒng)穩(wěn)定運(yùn)行的關(guān)鍵組件 電池管理系統(tǒng)(BMS)是電動(dòng)車(chē)輛和儲(chǔ)能系統(tǒng)中的一個(gè)重要組件,其主要功能是監(jiān)測(cè)和控制電池的狀態(tài),確保電池的安全運(yùn)行和優(yōu)化性能。為了保障BMS的穩(wěn)
    的頭像 發(fā)表于 02-01 17:25 ?983次閱讀

    鴻蒙開(kāi)發(fā)實(shí)戰(zhàn)-(ArkUI)List組件和Grid組件的使用

    一系列相同寬度的列表項(xiàng),連續(xù)、多行呈現(xiàn)同類(lèi)數(shù)據(jù),例如圖片和文本。常見(jiàn)的列表有線性列表(List列表)和網(wǎng)格布局(Grid列表): 為了幫助開(kāi)發(fā)者構(gòu)建包含列表的應(yīng)用,ArkUI提供了List組件和Grid
    發(fā)表于 01-18 20:18
    主站蜘蛛池模板: 可以免费观看的一级毛片| 免费观看成人毛片| 国产精品一级香蕉一区| 视频一区二区在线播放| 精品国产柚木在线观看| 一级特级片| 天堂网在线最新版www中文网| 四虎影视精品| 起碰免费视频| 国产亚洲一区二区精品| 2018天堂视频免费观看| 天天操夜夜操美女| 大杳蕉伊人狼人久久一本线| 97dyy影院理论片| 99视频热| 四虎网址大全| 男人的天堂在线免费视频| 国产亚洲婷婷香蕉久久精品 | www.啪啪.com| 狠狠色噜噜狠狠狠狠91| 性欧美高清久久久久久久| 日韩a免费| 黄色日本网站| 午夜视频在线观看国产www| 高h细节肉爽文bl文| 足控免费视频xxav| 性free3d| 美女天天色| 成人免费看毛片| 色一情一乱一乱91av| 视频在线免费看| 卡1卡2卡3精品推荐老狼| 香蕉久久夜色精品国产小说| 日本成人免费| www亚洲一区| 久久15| 亚洲成av人影片在线观看| 午夜精品福利在线观看| 久久香蕉国产精品一区二区三| 伊人干| 五月激情啪啪|