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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程
    +关注

    关注

    90

    文章

    3707

    浏览量

    96759
  • JS
    JS
    +关注

    关注

    0

    文章

    79

    浏览量

    18804
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73138

原文标题:JS UI框架下,List组件运行时的内存优化

文章出处:【微信号:HarmonyOS_Dev,微信公众号:HarmonyOS开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    WebGL/Canvas 内存泄露分析

    在构建高性能、长周期运行的 WebGL/Canvas 应用(如 3D 编辑器、数据可视化平台)时,内存管理是一个至关重要且极具挑战性的课题。 开发者通常面临的内存泄漏问题,其根源远比简单
    的头像 发表于 10-21 11:40 167次阅读
    WebGL/Canvas <b class='flag-5'>内存</b>泄露分析

    工业网关的内存有什么功能

    工业网关的内存是其核心硬件组件之一,承担着保障设备高效、稳定运行的关键作用,具体功能可从以下几个方面详细说明: 一、临时数据存储与处理 实时数据缓存:工业网关需要实时采集来自传感器、PLC(可编程
    的头像 发表于 08-15 10:15 426次阅读

    HarmonyOS NEXT应用元服务布局优化长列表使用懒加载与组件复用

    在列表场景下会采用List、Grid、WaterFlow等组件配合ForEach或者LazyForEach来实现,ForEach适合内容长度确定,内容在两屏以内的列表。LazyForEach适合长度
    发表于 06-27 16:08

    HarmonyOS NEXT应用元服务布局合理使用布局组件

    布的组件是按照特定的方向线性放置,如横向/纵向/Z序方向。除上述布局类型外,还有一些复杂布局能力,如Flex、List、Grid、RelativeContainer和自定义布局等。 使用Flex构建弹性
    发表于 06-20 15:48

    曝华为Mate80系列定制超大内存 王炸是大内存与麒麟9030通过SiP封装技术集成

    超过20GB,要知道目前在售的华为机型最大配备的内存也只有16GB。华为Mate 80系列手机将一举成为华为手机史上内存最大的机型。 运行内存的响应速度比硬盘快得多,在端侧AI大模型越加普及的现在,若想实现手机快速调用AI能力,
    的头像 发表于 06-17 11:50 2772次阅读

    HarmonyOS优化应用内存占用问题性能优化一

    一、 概述 用户功能的不断增强,应用越来越复杂,占用的内存也在不断膨胀,而内存作为系统的稀缺资源比较有限,当应用程序占用过多内存时,系统可能会频繁进行内存回收和重新分配,导致应用程序的
    发表于 05-21 11:27

    创建列表 (List) 介绍,一起来看看是做什么的

    应用程序中的常见要求(如通讯录、音乐列表、购物清单等)。 开发布局 设置主轴方向 List组件主轴默认是垂直方向,即默认情况下不需要手动设置List方向,就可以构建一个垂直滚动列表。 若是水平滚动列表
    发表于 04-30 07:06

    Demo示例: List的使用

    List 列表包含一系列相同宽度的列表项。适合连续、多行呈现同类数据,例如图片和文本。 子组件 仅支持ListItem、ListItemGroup子组件。 常用接口 List(v
    发表于 04-28 06:49

    AIWA HS-JS415维修手册

    电子发烧友网站提供《AIWA HS-JS415维修手册.pdf》资料免费下载
    发表于 04-08 10:37 3次下载

    AIWA JS215维修手册

    电子发烧友网站提供《AIWA JS215维修手册.pdf》资料免费下载
    发表于 04-01 16:44 3次下载

    如何使用MCX N ROM API进行内部闪存擦除/编程?

    使用 MCX N ROM API 进行内部闪存擦除/编程
    发表于 03-27 07:04

    求助,关于U575RI的GPDMA_LINKED_list模式的疑问求解

    *1024*4); 启动后,只有链表1、2生效,链表3无报错但是无效 /** * @briefDMA Linked-list DCMIQueue configuration * @paramNone
    发表于 03-07 08:02

    DDR内存控制器的架构解析

    DDR内存控制器是一个高度集成的组件,支持多种DDR内存类型(DDR2、DDR3、DDR3L、LPDDR2),并通过精心设计的架构来优化内存访问效率。
    的头像 发表于 03-05 13:47 3259次阅读
    DDR<b class='flag-5'>内存</b>控制器的架构解析

    Bun 1.2震撼发布:全力挑战Node.js生态的JavaScript运行时新星

    方面取得的突破性进展。 Bun 团队改变了此前被动修复问题的策略,转而主动运行 Node.js 的测试套件来提升
    的头像 发表于 01-24 10:42 1321次阅读
    Bun 1.2震撼发布:全力挑战Node.<b class='flag-5'>js</b>生态的JavaScript<b class='flag-5'>运行</b>时新星

    使用 Memtester 对华为云 X 实例进行内存性能测试

    整体的稳定性和响应速度有着举足轻重的影响。无论是数据库应用、虚拟化技术,还是大数据处理,内存带宽和延迟都直接影响着应用的运行效率。因此,了解云服务
    的头像 发表于 12-30 14:52 936次阅读
    使用 Memtester 对华为云 X 实例进<b class='flag-5'>行内存</b>性能测试