延迟加载
随着应用程序功能的扩展,冷启动时间显著增加,主要是因为启动初期加载了大量未实际执行的模块。这不仅延长了应用的初始化时间,还浪费了资源。需要精简加载流程,剔除非必需的文件执行,优化冷启动性能,确保用户体验流畅。
说明:
延迟加载特性在API 12版本开始支持。
开发者如需在API 12上使用lazy import语法,需在工程中配置"compatibleSdkVersionStage": "beta3",否则将无法通过编译。参考DevEco Studio build-profile.json5配置文件说明。
针对API version大于12的工程,开发者可直接使用lazy import语法,无需再进行其他配置。
功能特性
延迟加载特性使文件在冷启动阶段不被加载,而是在程序运行时按需加载,从而缩短冷启动时间。
使用方式
开发者可以利用DevEco Profiler展示冷启动过程 文件加载情况、可延迟加载文件检测。通过对这些数据的分析,开发者可以精准定位启动阶段不必预先加载的文件列表,并在这些文件的调用点增加lazy标识。但需要注意,后续执行的加载是同步加载,可能阻塞任务执行(如单击任务,触发了延迟加载,那么运行时会去执行冷启动未加载的文件,从而增加耗时),因此是否使用lazy需要开发者自行评估。
说明:
不建议盲目增加lazy,这会增加编译和运行时的识别开销。
场景行为解析
- 使用lazy-import延迟加载。
// main.ets
import lazy { a } from "./mod1"; // "mod1" 未执行
import { c } from "./mod2"; // "mod2" 执行
// ...
console.info("main executed");
while (false) {
let xx = a;
let yy = c;
}
// mod1.ets
export let a = "mod1 executed"
console.info(a);
// mod2.ets
export let c = "mod2 executed"
console.info(c);
执行结果为:
mod2 executed
main executed
- 同时对同一模块引用lazy-import与import。
// main.ets
import lazy { a } from "./mod1"; // "mod1" 未执行
import { c } from "./mod2"; // "mod2" 执行
import { b } from "./mod1"; // "mod1" 执行
// ...
console.info("main executed");
while (false) {
let xx = a;
let yy = c;
let zz = b;
}
// mod1.ets
export let a = "mod1 a executed"
console.info(a);
export let b = "mod1 b executed"
console.info(b);
// mod2.ets
export let c = "mod2 c executed"
console.info(c);
执行结果为:
mod2 c executed
mod1 a executed
mod1 b executed
main executed
如果在main.ets内删除lazy关键字,执行顺序如下:
mod1 a executed
mod1 b executed
mod2 c executed
main executed