深入鸿蒙开发-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、降低编码体验,提升响应速度并节省空间

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/110828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android查漏补缺(6)android相关属性

一、Android相关属性的介绍 1.android:exported true 在Activity中该属性用来标示:当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动。

Java学习之Java基础部分知识点

Java基础 一、Java语言具有哪些特点? Java为纯面向对象的语言。它能够直接反应现实生活中的对象。具有平台无关性。java利用Java虚拟机运行字节码,无论是在Windows、Linux还是MacOS等其它平台对Java程序进行编译,编译后的程序可在其它平台运…

drawio简介以及下载安装

drawio简介以及下载安装 drawio是一款非常强大的开源在线的流程图编辑器,支持绘制各种形式的图表,提供了 Web端与客户端支持,同时也支持多种资源类型的导出。 访问网址:draw.io或者直接使用app.diagrams.net直接打开可以使用在线版…

STM32 裸机编程 03

MCU 启动和向量表 当 STM32F429 MCU 启动时,它会从 flash 存储区最前面的位置读取一个叫作“向量表”的东西。“向量表”的概念所有 ARM MCU 都通用,它是一个包含 32 位中断处理程序地址的数组。对于所有 ARM MCU,向量表前 16 个地址由 ARM …

VSCode搭建ESP32 ESP-IDF开发环境-Windows

陈拓 2023/10/09-2023/10/14 1. 安装Windows系统下的ESP32 ESP-IDF开发环境 见《Windows系统安装ESP32 ESP-IDF开发环境》 Windows系统安装ESP32 ESP-IDF开发环境-CSDN博客Windows系统安装ESP32 ESP-IDF开发环境。https://blog.csdn.net/chentuo2000/article/details/1339225…

迅为RK3588开发板使用RKNN-Toolkit-lite2运行测试程序

1 首先也需要部署运行环境,将库文件放入 RK3588 开发板上,我们将网盘资料“iTOP-3588 开发 板 \02_ 【 iTOP-RK3588 开 发 板 】 开 发 资 料 \12_NPU 使 用 配 套 资 料 \05_Linux_librknn_api\librknn_api\aarch64”路径下的文件通过U盘拷贝到开发板的…

AI AIgents时代-(五.)Autogen

由微软开发的 Autogen 是一个新的 Agents 项目,刚一上线就登上GitHub热榜,狂揽11k星✨✨✨ 项目地址:https://github.com/microsoft/autogen Autogen 允许你根据需要创建任意数量的Agents,并让它们协同工作以执行任务。它的独特之…

stable-diffusion-webui sdxl模型代码分析

采样器这块基本都是用的k-diffusion,模型用的是stability的原生项目generative-models中的sgm,这点和fooocus不同,fooocus底层依赖comfyui中的models,comfy是用load_state_dict的方式解析的,用的load_checkpoint_guess…

实时精准 自我防护 | 开源网安RASP平台能力获客户认可!

近日,开源网安收到了一封来自华润数科的感谢信,表达了对开源网安团队在网络安全工作中给予大力支持的衷心感谢。开源网安十分注重客户的需求和信任,客户的满意和认可是开源网安最大的追求。 在助力华润数科网络安全工作开展过程中&#xff0c…

nextjs-一个基于React的全栈框架

一、nextjs基本介绍 Next.js是一个基于React的轻量级框架,用于构建React应用程序。它在React的基础上提供了一些增强功能,包括服务器渲染(SSR)、静态生成(SSG)、路由等。Next.js的目标是简化React应用程序…

十八、字符串(1)

本章概要 字符串的不可变 的重载与 StringBuilder 意外递归字符串操作 字符串操作毫无疑问是计算机程序设计中最常见的行为之一。 在 Java 大展拳脚的 Web 系统中更是如此。在本章中,我们将深入学习在 Java 语言中应用最广泛的 String 类,并研究与之相关…

pymysql连接Mariadb/Mysql出现错误(配置正确情况下)解决办法

场景:在kali中使用python中pymysql对Mariadb进行连接,在整个过程中配置全部正确,但是就是无法进行连接,提示结果如下: Access denied for user rootlocalhost解决办法:进入数据库中,将默认密码…

实验室烧杯可以用超声波清洗机吗

实验室烧杯可以用超声波清洗机吗?答案是可以的!超声波清洗机不仅可以清洗实验烧杯,还可以用于清洗实验室中的试管、培养皿、移液管、载玻片、容量瓶、锥形瓶等各类实验器皿。在实验中,如果烧杯清洁不到位,会使得实验数…

边缘服务器的未来是什么?思考 5G 和 AI 需求

什么是边缘服务器 边缘服务器是一种分布式计算模式,旨在提高数据中心和云服务的效率,并解决设备之间通信的延迟问题。它将业务从中央数据中心转移到边缘设备附近,将计算、存储和网络资源靠近终端用户和设备,以实现更快速的数据处…

分布式存储 vs. 全闪集中式存储:金融数据仓库场景下的性能对比

作者:深耕行业的 SmartX 金融团队 张德敏 近年来随着金融行业的高速发展,经营决策者及监管机构对信息时效性的要求越来越高,科技部门面临诸多挑战。例如,不少金融机构使用数仓业务系统,为公司高层提供日常经营报表&am…

CSV文件新增数据知多少

CSV文件编辑数据时 一、如果数据的长度不超过11位,直接正常输入 二、如果数据的长度大于等于11位,新增数据时,将列格式改为文本,并且输入数字,数字使用文本格式保存 如果数字长度超过11位,则展示为E科学…

seq“ 和 “time“ 字段

在RTP(Real-time Transport Protocol)报文中,"seq" 和 "time" 字段分别表示以下内容: 1. **Seq(Sequence Number)字段**:Seq字段是RTP头部中的一个16位字段,用…

学习gin-vue-admin之创建api和swagger

文章目录 go:generateViper 读写配置文件ZAP 保存日志定时任务创建apimodel步骤 1. 创建service步骤 2. 创建api步骤 3. 创建router 初始化总路由启动go-swagger路由配置swag init test将嵌套结构定义为指针或对象利弊结构体嵌套学习资源 go:generate //go:generate go env -w …

​iOS上架App Store的全攻略

第一步:申请开发者账号 在开始将应用上架到App Store之前,你需要申请一个开发者账号。 1.1 打开苹果开发者中心网站:Apple Developer 1.2 使用Apple ID和密码登录(如果没有账号则需要注册),要确保使用与公…

瑞芯微RKNN开发·yolov5

官方预训练模型转换 下载yolov5-v6.0分支源码解压到本地,并配置基础运行环境。下载官方预训练模型 yolov5n.ptyolov5s.ptyolov5m.pt… 进入yolov5-6.0目录下,新建文件夹weights,并将步骤2中下载的权重文件放进去。修改models/yolo.py文件 …