鸿蒙NEXT开发【ArkTS高性能编程】性能

ArkTS高性能编程概述

高性能编程指的是在语法使用过程中,通过优化一些影响性能的代码片段,使代码以最优的方式执行。以下实践是在开发过程中逐步总结出来的一些高性能的写法和建议,实践包含变量声明、属性的访问、数值计算、数据结构的使用以及函数声明与使用等内容,在业务功能实现过程中,要同步思考并理解高性能写法的原理,运用到代码逻辑实现中。

变量声明

使用const声明常量

对于初期明确不会改变的变量,尽量使用const进行初始化,这里的常量包含基础类型和引用类型。通过const保证地址不会发生变化,能够极大减少由于编码时误操作导致的赋值等行为,造成对原有逻辑的改变,声明为const能够在编辑时及时发现错误。其中当const声明的是引用类型时,引用类型内部的属性变化是允许的,对于这种不存在地址变化的情况下,也建议使用const声明。

【反例】

// 该变量在后续过程并未发生改变,建议声明为常量
let PRICE = 10000;

function getPrice() {
  return PRICE;
}

class ClassA {
  propA: string = 'propA'
} 
// 该引用类型的变量在后续过程变量地址并未发生改变,仅修改了变量的属性,建议使用const声明
let classA: ClassA = new ClassA();
classA.propA = 'Property A';

【正例】

const PRICE = 10000; // 常量声明为基础类型时,其内容不可改变

function getPrice() {
  return PRICE;
}

class ClassA {
  propA: string = 'propA'
}

// 常量声明为引用类型时,其地址不可改变,但可以改变属性
const classA: ClassA = new ClassA();
classA.propA = 'Property A';

指定number的类型

对于number类型,编译器在优化时会区分int和double类型。开发者在初始化number类型的变量时,如果预期是整数类型就初始化为0,小数类型就初始化为0.0,避免将一个number类型初始化为undefined或者null。

【正例】

function calAddSum(addNum: number): number {
  // count预期是int,不要声明成undefined/null或0.0,直接初始化为0
  let count = 0;
  count += addNum;
  return count;
}

减少使用ESObject

ESObject主要用于在ArkTS和TS/JS跨语言调用的场景中作为类型标注,在非跨语言场景中使用ESObject标注类型,会引入不必要的跨语言调用,造成额外的性能开销,建议在非跨语言调用的场景下,避免使用ESObject,引入明确的类型进行注释。

【反例】

// lib.ets
interface TestA {
  sum: number
}

export function getObject(value: number): TestA {
  let obj: TestA = { sum: value };
  return obj;
}

// app.ets
import { getObject } from 'lib';
let obj:ESObject = getObject(123); // 通过ESObject定义接受类型

【正例】

1、在lib.ets文件中导出对应的接口类型和方法

// lib.ets
export interface TestA {
  sum: number
}

export function getObject(value: number): TestA {
  let obj: TestA = { sum: value };
  return obj;
}

2、在使用该方法的文件app.ets,引入对应的类型

// app.ets
import { getObject, TestA } from './lib';

let obj: TestA = getObject(123); // 显式引入标注类型

属性访问

减少变量的属性查找

在要求性能的场景下,建议通过使用将全局变量存储为局部变量的方式来减少全局查找,因为访问局部变量的速度要比访问全局变量的速度更快。重复的访问同一个变量,将造成不必要的消耗,尤其当类似的访问出现在循环过程中,其对于性能的影响更大。

在实际中可能会遇到在循环中会大量进行一些常量的访问操作,该常量在循环中不会改变,可以提取到循环外部,减少属性访问的次数。例如下面这个用例,Time是一个包含了日期信息的对象,Time.Info是记录日期的数组,示例中对于

你可能感兴趣的:(鸿蒙开发实例,harmonyos,openharmony,鸿蒙,性能优化,青少年编程,ArkTS,鸿蒙系统)