深入鸿蒙开发-OpenHarmony高性能开发的三位一体

OpenHarmony LazyForEach ArkUI 高性能 OpenHarmony应用性能优化概览 核心思想

我们相信时间以线性存在,它持续不变地进行,直到无穷无尽。
但过去、现在和未来的不同,昨日、今日和明日可能不是连贯的,而是互相组合的永无止尽的循环。
世间万物皆有关联。

高性能开发是为了增强用户使用app的体验。从用户角度看,主要由3个方面共同决定。

  • 南向能力:硬件的性能。一路向南,有芯片能力,底层驱动能力,硬件设备能力等。
  • 北向能力:操作系统本身的性能。一路向北,有内核层能力、系统服务层能力、框架层能力等。
  • 应用开发:开发者编写应用的性能。

一般开发者只能自上而下进行整改,即通过改善应用代码来增强用户体验。如果发现问题无法解决,可以反馈至系统层。同理,框架层无法解决,可以反馈至硬件层。如果硬件层无法解决,瓶颈就在基础物理研究了。

我们这里能做的是应用层面提高应用性能。

可以思考的维度

对于应用优化,我们可以从不同维度分析,拆解性能优化项。比如从编译、构建、启动、运行等阶段分析,也可以从开发语言合理使用、组件正确使用、性能工具调优等角度分析。本文尝试另用一种抽象的角度归类性能优化。

本文思考的维度

我们的世界被两大维度限定:时间和空间。

同样,计算机的组成也离不开这两个法则。因此,我们可以从这三个维度归类性能优化项:时间、空间、以及围绕它们的做出的权衡。

时间优化 空间优化 转移
思想 减少不必要的时间浪费 减少不必要的空间浪费 -

前两者很容易理解,我们可以理解成没有负面影响的编码优化?‍?,是大部分情况下推荐的用法。

关键是第三点,你可能有疑问?️,有了时间和空间维度不是已经覆盖了全部吗,为什么还有第三维度。要理解这个问题可以从对太极☯️的理解开始。太极看上去只有阴和阳,但实际它们之间的曲线,以及两个互换位置的点也表达了一个交融状态,这就是隐藏的第三维度。实际上这个第三维度才是太极思想的精华。达到一种你中有我,我中有你的状态。

能量不会凭空消失,只会转移。

同理,问题也不会消失但可以转移。

我在一些性能优化的文章中常常会看到一些“偷梁换柱”的情况:比如说在当前函数从系统角度简化了一些逻辑,但这些逻辑从业务角度看又是必须的,那么这些事情不在这个函数做,实际上也需要在别的函数里做。从单看这个函数来说,确实是优化了,似乎是转移了问题?。

但反过来说,这种“偷梁换柱”的行为在某种特定场景是完全行得通的,比如对于一些可以延期执行的、不那么必要的任务确实可以转移出去。而转移到的位置恰好是空间有余、时间富裕的,那么这种优化就是可取的。?️

时间转移到空间

思想:通过开辟更大的空间来缩短执行的时间
场景:如*多线程*

空间转移到时间

思想:通过延长执行的时间来节省空间
场景:如*消息队列*

时间转移到时间

思想:通过将问题处理的时间提前或推迟达到当下时间点的优化
场景:如*预加载**懒加载*

空间转移到空间

思想:通过将当前问题移交给其他模块处理达到当前空间点的优化
场景:如*分布式计算*

时间和空间的权衡

思想:将上述四种方法按一定比例组合使用,设计这个组合关系。
场景:如*hadoop或spark的架构设计*

关键是我们把负面影响转移到哪里了?

是不是转移到负面影响比之前更小的地方?

如果答案是,就可以把这种有负面影响的优化当成第三种优化的维度。

三维度性能优化方向

通过这三个维度的抽象,为我们提供了任意场景优化的思考方向。对于任何需要优化的模块,基本都可以从这三个维度思考是否有优化空间。

  • 时间优化
  • 空间优化
  • 问题转移

三维度性能优化全景

介于上述分析,整理的官网性能优化全景如下:

行为,目的的形式细化二级分类

时间优化

1、节省计算时间,提升响应速度

高性能编程

合理进行状态管理

精准控制组件的更新范围

减少动画丢帧

提升应用冷启动速度-分析应用冷启动耗时

提升应用响应速度-使用容器限制刷新范围

合理使用IPC通信-减少同步接口调用

OpenHarmony应用程序动效能力实践-组件转场动画使用transition

OpenHarmony应用程序动效能力实践-组件布局改动时使用图形变换属性动画

2、减少访问、转换时间,提升响应速度

高性能编程实践-属性访问与属性增删

安全和高效的使用N-API开发Native模块-数值转换

空间优化

1、节约内存,节省空间

安全和高效的使用N-API开发Native模块-缩短对象生命周期

提升应用冷启动速度-缩短Application&Ability初始化阶段耗时

2、避免溢出,节省空间

高性能编程实践-数值计算避免溢出

问题转移

空间换时间

1、增加内存,加快响应

列表场景性能提升实践-组件复用

高效并发编程

组件复用实践

WaterFlow高性能开发指导-组件复用

2、异步,加快响应

安全和高效的使用N-异步示例

OpenHarmony多线程能力场景化示例实践

提升应用冷启动速度-缩短Ability生命周期阶段耗时

提升应用冷启动速度-缩短加载绘制首页阶段耗时

提升应用响应速度-避免主线程被非UI任务阻塞

时间换空间

1、数据拆分处理,加快响应

合理使用IPC通信-大数据IPC通信改为小数据批量IPC通信

调整执行时间

1、部分数据延迟加载,提升首次加载响应速度

列表场景性能提升实践-懒加载

正确使用LazyForEach优化

WaterFlow高性能开发指导-使用懒加载

WaterFlow高性能开发指导-无限滚动

提升应用响应速度-按需加载列表组件的元素

2、部分数据预加载,提升操作时响应速度

列表场景性能提升实践-缓存列表项

WaterFlow高性能开发指导-提前新增数据

Swiper高性能开发指导-Swiper 预加载机制说明

3、 动态加载换静态加载(提前到编译期),提升响应速度

高性能编程实践-对象初始化

高性能编程实践-避免使用type类型标注

高性能编程实践-声明参数要和实际的参数一致

高性能编程实践-避免动态声明function与class

其他

1、降低编码体验,提升响应速度并节省空间

列表场景性能提升实践-布局优化