HarmonyOS开发实战( Beta5版)延迟加载lazy-import实践使用指导

news2024/9/21 22:39:46

随着应用功能持续增加,应用规模不断扩大,依赖的模块文件逐渐变多,应用冷启动加载模块的时间也越来越长。而在实际冷启动过程中执行了很多应用整体依赖但当前未使用的文件,此时可以通过延迟加载 lazy-import 的方法延缓对这些冗余文件的加载,使待加载文件在冷启动阶段不被加载,而在后续导出变量被真正使用时再同步加载执行文件,节省资源以提高应用冷启动性能。

lazy-import与动态加载的区别

lazy-import与动态加载都可以实现主动延后特定文件的执行时间,帮助设备均摊性能消耗,缓解特定时段性能压力的能力。

动态加载lazy-import
语法示例let A = await import("./A");import lazy { A } from "./A";
性能开销1.创建异步任务开销
2.执行到动态加载时,触发依赖模块的模块解析+源码执行。
1.lazy-import的模块解析在冷启动依旧会触发遍历。
2.导入的变量A被使用到时,触发模块的源码执行。
使用位置代码块/运行逻辑中使用需要写在源码开头
是否可以运行时拼接
加载时序异步同步

开发者在使用动态加载时,需要将静态加载的代码(同步导入)改写成动态加载语法(异步导入),修改量较大。其次如果希望通过动态加载在冷启动阶段产生优化,需要开发者明确感知被动态加载文件不会在冷启动被执行才会有收益,否则会增大冷启动开销(放入异步队列等)。相较于动态加载,使用lazy-import延迟加载,开发者只需要在import语法中增加lazy关键字就可以实现延迟加载,使用更加方便。

使用场景

下述例子中A文件被引用,在应用启动到点击按钮的这段时间里,A文件并没有被实际执行,在冷启动阶段加载A文件的行为属于冗余。源码参考

// A为任意可以被引入的ets文件
import { A } from "./A";

@Entry
@Component
struct Index {
  build() {
    RelativeContainer() {
      Button('点击执行A文件')
        .onClick(() => {
          // 点击后触发A文件的执行
          console.log("执行A文件", A);
        })
    }
    // ...
  }
}

img

通过抓取Trace图查看调用栈可发现,应用在冷启动时加载了A文件。

使用方法

ArkTS冗余文件检测工具

在规避冗余文件时,首先需要筛选出哪些依赖文件在冷启动时未被使用,此时可以使用ArkTS冗余文件检测工具,梳理出冷启动加载过程中未被使用的文件名单。

工具使用
  1. 打开模块化日志打印打点开关,重启设备。

    hdc shell param set persist.ark.properties 0x200105c
    hdc shell reboot
  2. 启动应用,启动结束后关闭应用。

  3. 下载文件到本地,其中${bundleName}为应用名。

    hdc file recv data/app/el2/100/base/${bundleName}/files/${bundleName}_redundant_file.txt D:\
  4. 对上述示例代码获取到的文件进行分析。

    img

    大致结构:

    1. Summary :加载各项文件的总耗时。
    2. used file:冷启动2s内应用使用到的文件。
    3. unused file:冷启动2S内应用没有使用的文件(即冷启动阶段可延迟加载的文件)。

lazy-import示例

在通过工具筛选出冗余文件后,开发者可选择在引入时添加lazy关键字对文件进行标识,表示该文件可被延迟加载。源码参考

// 此处添加lazy关键字,标记该文件可延迟加载
import lazy { A } from "./A";

@Entry
@Component
struct Index {
  build() {
    RelativeContainer() {
      Button('点击执行A文件')
        .onClick(() => {
          // 点击后触发A文件的执行
          console.log("执行A文件", A);
        })
    }
    // ...
  }
}

img

通过抓取Trace图查看调用栈可发现,使用lazy-import标识后,应用在冷启动时不再加载A文件。

注意事项

  1. 由于lazy-import的后续加载是同步加载,可能在某些场景阻塞任务执行(比如在点击业务时触发了懒加载,那么运行时会执行冷启动为加载的文件,增加执行耗时,存在掉帧风险),是否使用延迟加载仍需要开发者自行评估。
  2. 不推荐开发者在未根据实际业务梳理出可延迟文件时盲目增加延迟加载,过多的延迟加载同样会增大编译及运行时的识别开销。
  3. 已经被动态加载的文件同时使用lazy-import时,这些文件会执行lazy标识,在动态加载的then逻辑中同步加载。 关于lazy-import的基础使用方法请参考官方文档:延迟加载。

性能分析

加载文件耗时(微秒us)
优化前412us
优化后350us

根据上述优化前后案例Trace图对比分析,使用延迟加载后应用冷启动时不再加载A文件,在资源加载阶段减少因加载冗余文件产生的耗时约15%,提高了应用冷启动性能。(由于案例仅演示场景,优化数据仅做参考,在实际业务中随着引用文件的复杂度提高,引用文件数量增多,优化效果也会随之提升。)

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线

GitCode - 全球开发者的开源社区,开源代码托管平台  希望这一份鸿蒙学习文档能够给大家带来帮助~


鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频学习教程+学习PDF文档

HarmonyOS Next 最新全套视频教程

  纯血版鸿蒙全套学习文档(面试、文档、全套视频等)       

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

独立产品灵感周刊 DecoHack #066 – 下周苹果发布会要来了

本周刊记录有趣好玩的独立产品/设计/开发相关内容,每周一发布,往期内容同样精彩,感兴趣的伙伴可以到 官网查看更多内容。可以 邮件订阅或 RSS订阅本周刊。欢迎通过 Twitter 私信推荐或投稿。 💻 产品推荐 1. Apple Bento Slides…

基于C++实现(MFC界面)家谱管理系统

一、题目:家谱管理系统 二、内容: 2.1 概述 2.1.1 选题原因 做此题的原因是因为可以比较方便的记录家族历代成员的情况与关系,能很好的保存家族每一代的信息,而不用人工纸质的方式来存取家谱,更便于人们保存和使用…

青蓝智慧科技:京津冀氢能与绿色低碳创新应用场景发布

8月29日,北京成功举办了京津冀(唐山)氢能与绿色低碳创新应用场景的发布及供需对接活动。 在此活动中,唐山市科技局推出了涉及氢能与绿色低碳的创新应用方案,这些方案旨在抓住京津冀氢燃料电池汽车示范城市群、碳达峰试…

java后端开发-Mybatis连接数据库步骤

🤹‍♀️潜意识起点:个人主页 🎙座右铭:得之坦然,失之淡然。 💎擅长领域:前端 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我持…

软通动力子公司鸿湖万联重磅发布SwanLinkOS 5,擘画开源鸿蒙AI PC新篇章

在刚刚落下帷幕的首届H•I AI 探索峰会上,软通动力再次于鸿蒙生态领域实现突破。此次活动中,软通动力高级副总裁、鸿湖万联总经理秦张波发布SwanLinkOS 5(天鸿操作系统),并联合软通计算(同方计算机&#xf…

Qt 样式表、选择器、盒子模型

1、两种样式表的写法 方式一(普通写法): this->setStyleSheet("QPushButton""{""background:yellow;""font:bold 14px;""color: red;""}""QPushButton:hover"&quo…

【Day07】

目录 MySQL-DQL- 基本查询 MySQL-DQL- 条件查询 MySQL-DQL- 聚合函数 MySQL-DQL- 分组查询 MySQL-DQL- 排序查询 MySQL-DQL- 分页查询 MySQL-DQL- 案例 MySQL-多表设计-一对多 MySQL-多表设计-一对多-外键约束 MySQL-多表设计-一对一&多对多 MySQL-多表设计-案例…

【MA35D1】buildroot 编译使用经验

文章目录 芯片介绍Buildroot开发Linux实践环境搭建代码获取编译执行步骤(仅适用于我公司产品) 后续有需要更改的输出文件目录 芯片介绍 NuMicro MA35D1系列为一颗异核同构的多核心微处理器,适用于高端 Edge IIoT Gateway。它是基于双核 64 位…

【OpenWrt(3)】内网搭建iperf3测速服务器

下载的iperf3 网站:https://iperf.fr/iperf-download.php Window地址:https://github.com/ar51an/iperf3-win-builds 安卓:https://gitee.com/hiyanyx/magic-i-perf 文章目录 下载的iperf3Windows 服务器启动安卓客户端启动参考 Windows 服务…

简单的EasyCaptcha图片验证码学习

简单的EasyCaptcha图片验证码学习 1. 需求 图片验证码是一种常见的验证形式,它通过生成一串随机数字或符号,并加入一些干扰像素,最终生成用于验证的图片。这种验证码的设计旨在增加破解难度,主要通过加大干扰强度来提高安全性。…

如何在 Vue 中创建一个带有表格和表单的弹窗

本文将通过一个具体的示例来介绍如何在 Vue 应用中实现一个带有表格和表单功能的弹窗组件。我们将使用 Element UI 库中的 el-dialog 组件来构建这个弹窗,并结合 el-table 和 el-form 来展示数据并允许用户进行编辑。 效果图: 完整代码最底部&#xff0…

火语言RPA流程组件介绍--文件系统监控

🚩【组件功能】:监控指定文件夹或文件的创建、变更删除等事件 配置预览 配置说明 事件类型 “异步回调处理”、“同步等待”2种类型供选择。流程是否等待发生监控文件的创建、变更、删除事件,异步不等待,同步则等待。 监控文件…

MySQL创建数据库和表应用教程

前言 MySQL 是一种流行的关系型数据库管理系统(RDBMS),广泛应用于 web 应用开发中。以下是一个简单的 MySQL 创建数据库和表的教程,涵盖了基本步骤。假设你已经安装了 MySQL 并且能够通过命令行或 MySQL Workbench 等工具访问它。…

【网络安全】服务基础第一阶段——第五节:Windows系统管理基础---- DHCP部署与安全

目录 一、DHCP协议 理解DHCP握手: 分配IP地址方式: DHCP协议报文的种类: DHCP协议工作过程: ​编辑DHCP四个阶段: 续约租期: 重新连接使用IP地址: DHCP安全性: 二、DHCP中继…

海龟交易系统所代表的传统CTA策略是不是过时了?

原创内容第639篇,专注量化投资、个人成长与财富自由。 量化投资具体步骤:数据、指标(因子),信号规则或因子合成,策略,绩效评估,风控。 其实所有的策略都可以归结为以上的步骤。 我…

Redis 篇-深入了解查询缓存与缓存所带来的问题(读写不一致、缓存穿透、缓存雪崩、缓存击穿)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 本章目录 1.0 什么是缓存 2.0 项目中具体如何添加缓存 3.0 添加缓存后所带来的问题 3.1 读写不一致问题 3.1.1 缓存更新策略 3.1.2 具体实现缓存与数据库的双写一致 3.2 缓存穿…

DAC专用功能芯片TI DAC8562/8563

DAC8563具有 2.5V、4ppm/C 基准的 16 位、双通道、低功耗、超低短时脉冲波形干扰、缓冲电压输出 DAC。 DAC8562是一款16位、双通道、串行接口的DAC,采用SPI接口进行通信,具有内部参考电压、软件可编程增益和输出保护等功能。 一、DAC8563的主要参数 供…

JVM面试(二)内存区域划分

内存区划分 Java虚拟机在执行Java程序的过程中会把它锁管理的内存划分为若干个不同的数据区域。 这些区域有各自不同的用途,以及创建和销毁的时间。 有的区域随着虚拟机的进程一直存在,有的区域依赖用户线程的启动和结束而建立和销毁。 根据《Java虚拟…

YOLOv8 训练15种动物分类模型

1. 下载数据集 https://hyper.ai/datasets/31084 2. 进行训练 这里数据集没做拆分,训练测试都是同一个数据集。 train.py:python from ultralytics import YOLO from ultralytics.utils import DEFAULT_CFG from datetime import datetimecurrent_time datetim…

2.1CPU内部结构

🎓 微机原理考点专栏(通篇免费) 欢迎来到我的微机原理专栏!我将帮助你在最短时间内掌握微机原理的核心内容,为你的考研或期末考试保驾护航。 为什么选择我的视频? 全程考点讲解:每一节视频都…