当前位置:首页>鸿蒙APP>鸿蒙开发 | ArkTS 高性能编程最佳实践,让你的应用快人一步

鸿蒙开发 | ArkTS 高性能编程最佳实践,让你的应用快人一步

  • 2026-11-08 11:15:41
鸿蒙开发 | ArkTS 高性能编程最佳实践,让你的应用快人一步

随着鸿蒙生态快速发展,越来越多开发者使用ArkTS进行应用开发。但同样是写业务逻辑,为什么有的应用流畅丝滑、启动飞快,有的却卡顿掉帧、启动缓慢?

答案往往藏在代码细节里。今天我们基于鸿蒙官方最新《ArkTS高性能编程》最佳实践,整理出一些可直接落地的优化方法,覆盖变量、属性、计算、数据结构、函数、模块加载六大场景,帮你写出更快、更稳、更省资源的ArkTS代码。


一、变量声明:从源头减少性能损耗

变量怎么写,直接影响运行时开销。

1. 能用const,绝不乱用let

  • 明确不变的变量,一律用const声明(包括基础类型与引用类型)
  • 好处:编译期提前报错、避免误赋值、利于编译器优化
  • 引用类型用const:地址不变,属性可正常修改

反例

letPRICE = 10000; // 全程不变却用letletclassA: ClassA = newClassA();

正例

constPRICE = 10000;constclassA: ClassA = newClassA();classA.propA = 'Property A'; // 属性可改

2. number类型要“整型归整型,浮点归浮点”

ArkTS编译器会区分int与double,混用会拖慢优化。

  • 整数初始化为0
  • 小数初始化为0.0
  • 避免undefined/null初始化number

正例

functioncalAddSum(addNum: number): number {let count = 0; // 明确整型  count += addNum;return count;}

3. 非跨语言场景,别用ESObject

ESObject只用于ArkTS ↔ TS/JS跨语言调用,普通场景用会带来额外跨语言开销。

  • 用明确接口/类型代替ESObject

二、属性访问:少查一次,快一分

高频访问(尤其循环)是性能重灾区。

1. 循环里把不变值“提出来”

局部变量访问速度 >> 全局/类静态属性查找。循环中不变的属性/计算结果,提前缓存为局部常量。

反例

for (let index = 0x8000; index > 0x8; index >>= 1) {// 每次循环都查 Time.INFO / Time.START  totalDays += ((Time.INFO[year - Time.START] & index) !== 0) ? 1 : 0;}

正例

const info = Time.INFO[year - Time.START]; // 只查1次for (let index = 0x8000; index > 0x8; index >>= 1) {if ((info & index) !== 0) totalDays++;}

2. 给类属性加访问修饰符

private/protected/public不只是规范,还能提升安全性与运行效率。

  • 内部状态用private
  • 对外接口用public

三、数值计算:TypedArray比普通Array快一大截

纯数值计算(图像处理、加解密、大数据运算)优先用TypedArray。

  • 基于ArrayBuffer,二进制存储,无额外封装开销
  • 内存紧凑、访问更快

反例

const array1 = new Array(1, 2, 3);const array2 = new Array(4, 5, 6);

正例

const typedArray1 = new Int8Array([1, 2, 3]);const typedArray2 = new Int8Array([4, 5, 6]);

四、数据结构:选对容器,少走弯路

1. 键值读写别用Record,用HashMap

频繁set/get场景,HashMap远快于普通对象。

  • 底层红黑树,读写稳定O(logN)
  • 官方推荐高性能容器

正例

importHashMapfrom'@ohos.util.HashMap';letinfo: HashMap<string, string> = newHashMap();info.set('aaa','aaa');let val = info.get('bbb');

2. 严禁写出“稀疏数组”

  • 不要直接new Array(100000)
  • 不要跳过大量下标直接赋值(如arr[9999] = 0)超过1024且空洞多,虚拟机自动转哈希表存储,访问速度暴跌。

五、函数与闭包:参数传递优于外部引用

尽量用参数传值,少用闭包抓外部变量

  • 闭包会增加创建与访问开销
  • 长期引用可能导致内存泄漏
  • 函数内改外部变量,用参数传递更高效

反例

const arr = [0,1,2];functionfoo() {  arr[0] = 1; // 直接抓外部变量return arr[0]+arr[1];}

正例

functionfoo(array: number[]): number {  array[0] = 1;return array[0]+array[1];}foo(arr);

六、导入导出:别让模块加载拖慢启动

冷启动慢,很多时候是import/export写得太乱。

1. 拒绝嵌套export *

多层export *会让依赖解析变成深度遍历,耗时爆炸。

  • 直接从源头导入,不要跨文件层层转发

反例Numbers → Utils → SecondPage → Index 层层export *

正例Index直接:

import { One } from'./Numbers';

2. 禁止无脑import *

只导入你用到的变量/函数,不要全量引入。

  • 减少无用导出的初始化
  • 大幅降低.ets文件执行耗时

反例

import * as nm from'../utils/Numbers';

正例

import { One } from'../utils/Numbers';

七、启动加速神器:Lazy‑Import延迟加载

应用越大,冷启动越慢,因为启动时加载了大量暂时不用的文件。官方给出零改逻辑、只加一个关键字的优化方案:lazy。

Lazy-Import怎么写?

import lazy { A } from"./A"; // 只加lazy

效果

  • 冷启动:不加载A文件
  • 真正使用A时:同步加载执行
  • 实测可降低冷启动加载耗时约15%+(视项目大小)

与动态import简单对比

特性
动态import
Lazy-Import
写法
await import(...)
import lazy { ... }
位置
代码块中
文件顶部
时序
异步
同步
改造成本
高
极低

注意:不要盲目全量lazy,先通过官方冗余文件检测工具,找出冷启动未使用的文件再优化。


总结:一套高性能ArkTS编码口诀

  • 变量不变用const,number分清楚整浮点
  • 循环属性提前提,类加修饰更安全
  • 数值计算TypedArray,键值用HashMap
  • 数组别稀疏,函数传参不抓外
  • 导入导出按需引,启动慢就用lazy

想让你的鸿蒙应用启动更快、运行更稳、占用更低,从今天开始,把这些规则应用到你项目的的SKILL.md里吧。

最新文章

随机文章