性能问题从哪来

用户对性能的感知很直接:点开慢、滑动卡、切回来要重进。这些问题大多不是算法错,而是主线程被不该在启动时做的事堵住了。优化的第一步不是瞎改,而是先量清楚时间花在哪。

没有度量就没有优化:先 Profiler 找到瓶颈,再动手,别凭感觉。

这篇把鸿蒙应用的性能优化按启动、渲染、内存三块讲清。

启动链路拆解

冷启动从进程创建到首帧上屏,依次经过:应用初始化、Ability 启动、首页构建、首帧渲染。每一段都可能被同步初始化拖慢。原则是:启动路径上只做首屏必需的事,其余延迟到空闲或用户操作时。

onCreate() {
  // 只初始化首屏必需
  initRouter()
  // 非必需的重初始化延后
  setTimeout(() => initAnalytics(), 1000)
}

把埋点、预加载这类非首屏任务移出启动关键路径。

首屏渲染优化

首屏慢,常因为一次性构建了太多组件。用懒加载把下面的页面延后构建,首屏只渲染可视区。复杂列表用 LazyForcer 按需生成,而不是一次铺全部。

性能优化清单
  • 启动非首屏任务延迟初始化。
  • 渲染列表按需生成,避免一次铺全。
  • 图片压缩、占位、按需加载。
  • 内存及时释放大图与监听。

列表与图片的懒加载

长列表最吃性能。LazyForEach 只渲染滑到的那几项,配合缓存回收。图片要压缩到显示尺寸,别把原图直接塞进小卡片。滑快了还没加载完就给占位图,避免白块闪烁。

鸿蒙性能优化:一条发光进度光带旁是一台抽象手机、进度条与仪表盘图标象征启动耗时被压缩的扁平科技插画
启动耗时:进度光带被一步步压缩。

内存与泄漏排查

内存泄漏表现为越用越卡、最后被系统杀。常见来源:未注销的全局监听、长生命周期对象持有短生命周期页面。退出页面时把监听、定时器清掉,大图用完即释放。