ArkTS高性能编程

一、概述

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

二、const声明常量

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

三、指定number的类型

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

四、减少使用ESObject

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

五、属性访问

减少变量的属性查找

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

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

六、给类属性添加访问修饰符

       在ArkTS中,对于类结构的属性提供了private、protected和public可访问修饰符。默认情况下一个属性的可访问修饰符为public。选取适当的可访问修饰符可以提升代码的安全性、可读性。

七、数值计算

数值计算使用TypedArray

       如果是纯数值计算的场合,推荐使用TypedArray数据结构。TypedArray类型化数组是一种类似数组的对象,其提供了一种用于在内存缓冲中访问原始二进制数据的机制。在一些图像数据处理、加解密的数据计算过程中使用TypedArray可以提高数据处理的效率,因为TypedArray是基于ArrayBuffer实现,在性能方面也能够进行较大提升。

八、数据结构的使用

选取合适的数据结构

      有些时候会采用Record的方式作为临时容器来处理属性存取的逻辑,例如如下案例中,对于info执行的操作是set存储以及读取的操作,这里更好的方式是采用标准内置Map以及基础类库提供的高性能容器类如HashMap。HashMap是ArkTS提供的高性能容器类,底层使用红黑树实现,提供了高性能的数据读写操作,可以用来实现快速读写键值。

避免造成稀疏数组

       分配数组时,需要避免使用如下的方式进行处理。当虚拟机在分配大小超过1024大小的数组时,会变成用哈希表来存储元素,相对数组用偏移来访问元素速度较慢,在开发时,尽量避免数组变成稀疏数组。

九。函数声明与使用

函数内部变量尽量使用参数传递

       能传递参数的尽量传递参数,不要使用闭包,闭包作为参数会多一次闭包的创建和访问。在普通函数中,修改外部作用域的变量时,建议通过函数的参数传递,因为在直接声明时引用外部作用域的变量,如果没有及时清理,可能有内存泄漏的风险。ArkTS中函数参数是引用类型时,作用于引用类型的修改会进行引用传递,函数内对形参的修改也会作用在实参上。

十、减少使用嵌套export */import *的方式

减少使用嵌套export *的方式全量导出

       Numbers文件导出变量One,需要在Index.ets中使用,但在Utils文件中export * from './Numbers',在SecondPage文件再次 export * from './Utils',中间嵌套多层导出文件,直到最后在实际引用方Index.ets文件中 import * from './SecondPage'。

       由于依赖模块解析采用深度优先遍历的方式来遍历模块依赖关系图中每一个模块记录,会先从入口文件的第一个导入语句开始一层层往更深层查找,直到最后一个没有导入语句的模块为止,连接好这个模块的导出变量之后又会回到上一级的模块重复这个步骤,因此多层export *的使用会导致依赖模块解析、文件执行阶段耗时增长。

减少import *的方式全量引用

       应用程序加载过程中,需要使用不同模块中的变量或函数,通常开发者会将相同类型的变量或函数放在同一个工具类文件中,使用时通过import的方式引入对应的模块,当工具类中存在较多暴露函数或变量时,推荐按需引用使用到的变量代替“import *”的方式,可以减少该阶段中.ets文件执行耗时,即减少文件中所有export变量的初始化过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值