【鸿蒙开发】性能优化

语言层面的优化

使用明确的数据类型,避免使用模糊的数据类型,例如ESObject。

使用AOT模式

AOT就是提前编译,将字节码提前编译成机器码,这样可以充分优化,从而加快执行速度。

未启用AOT时,一边运行一边进行机器码的生成。
开启AOT后,设备能直接运行已经提前优化过的机器码,大大提高执行速度。

应用启动优化

应用阶段划分:

  1. 第一阶段:应用进程的创建和初始化
  2. 第二阶段:App和Ability的初始化
  3. 第三阶段:Ability生命周期
  4. 第四阶段:加载绘制首页

每个启动阶段的优化策略:

  1. 第一阶段优化:设置合适分辨率的应用图标
  2. 第二阶段优化:减少首页Ability或者Page中import的模块数量,不是首页必须的模块可以使用动态异步加载,如await import(‘Page’)
  3. 第三阶段优化:Ability生命周期方法中,对于耗时操作进行异步处理
  4. 第四阶段优化:延迟加载,减少不必要的首页内容。例如使用LazyForEach替换ForEach

LazyForEach替换ForEach

LazyForEach是一种懒加载的模式,在循环绘制组件时能显著提升页面的加载速度。结合cacheCount方法能控制列表的缓存数量,实现更优的滑动体验。

减少丢帧卡顿

  • 避免在主线程上执行耗时操作:将耗时操作放在TaskPool或者Worker等后台进程中执行,从而防止主线程负载过高。
  • 减少渲染进程的冗余开销:使用资源图代替绘制、合理使用renderGroup、尺寸位置使用整数。
  • 减少试图嵌套层级
  • 组件复用
  • 控制状态变量关联的组件数量
  • 在对象上谨慎使用状态变量进行关联

优化案例

组件转场动画推荐使用transition,不推荐使用animateTo方法。

减少animateTo方法的使用数量,一起变更比分开变更更加高效。

多次animateTo时统一更新状态变量,减少多次更新状态变量导致的开销。

使用RenderGroup可以缓存组件及其子组件的绘制,从而降低绘制负载优化渲染性能。适合没状态绑定的不变组件,如果有状态绑定,当状态变化时缓存就是失效了。

使用@Reusable标记复用组件,适用频繁创建和销毁的组件,或反复切换条件渲染的控制分支且控制分支中的组件子树结构相同。

不推荐使用更新单个状态变量的形式控制多个组件的更新(命令式);
推荐使用状态变量和组件一对一绑定的方式,以数据变更驱动组件的刷新(声明式);

合理控制状态变量更新范围,避免关联刷新大量组件。关联变化较大的状态变量可以通过对象组合成一个状态变量,针对渲染成本较高的组件建议使用独立的状态变量进行关联。

理解@Prop和@ObjectLink的区别:@Prop是深拷贝关联,@ObjectLink是浅拷贝关联,因此优先推荐使用@ObjectLink的方式,从而减少系统内存开销。

性能调优工具

Profile调优工具

合理使用布局

组件布局属性(width、height、padding、margin等)大小发生变化会导致受影响的整个组件树重新更新,而非布局属性(Color、BackgroundColor、opacity等)的变化仅影响组件自身。这一点跟Web界面的渲染机制类似,因此我们在更新界面元素时,尽量减少布局属性的变化,防止影响整个组件的重新渲染。如果某些组件需要经常变化,可以将组件置于一个固定布局(这个布局内,布局属性固定)内,将影响固定在这个固定布局内部,从而减少对其他组件的影响。

精简节点数

  • 移除冗余节点
  • 使用扁平化布局减少节点数

在这里插入图片描述

扁平化方法:通过将嵌套结构摊开,减少中间节点,从而提升渲染速度。常用方法有:

  • 通过RelativeContainer 相对布局实现扁平化
  • 通过锚点定位实现扁平化
  • 通过Grid布局实现扁平化

利用布局边界减少计算

对于能够在初期给定宽高的组件,在进行UI描述时尽量给定宽高数值,能够减少由于容器尺寸变化造成的重新测算过程的性能。

合理控制元素的显示与隐藏

首次绘制时,if会根据是否为true决定是否创建组件,而visibility组件无论是否显示都要创建组件。
再次显示时,if由于首次没有创建组件,再次显示时会创建组件,并经过Measure和Layout阶段。而visibility组件已经创建过,只需要经过Measure和Layout阶段。

  • 只有初始的一次渲染或者交互次数很少的情况下,建议使用if条件判断来控制元素的显示与隐藏效果,对于内存有较大提升。
  • 如果会频繁响应显示与隐藏的交互效果,建议使用切换Visibility.None和Visibility.Visible来控制元素显示与隐藏,提高性能。

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

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

相关文章

群晖NAS部署PlaylistDL音乐下载器结合cpolar搭建私有云音乐库

文章目录 前言1.关于PlaylistDL音乐下载器2.Docker部署3.PlaylistDL简单使用4.群晖安装Cpolar工具5.创建PlaylistDL音乐下载器的公网地址6.配置固定公网地址总结 前言 各位小伙伴们,你们是不是经常为了听几首歌而开通各种平台的VIP?或者为了下载无损音质…

REST架构风格介绍

一.REST(表述性状态转移) 1.定义 REST(Representational State Transfer)是由 Roy Fielding 在 2000 年提出的一种软件架构风格,用于设计网络应用的通信模式。它基于 HTTP 协议,强调通过统一的接口&#…

计算机视觉----基于锚点的车道线检测、从Line-CNN到CLRNet到CLRKDNet 本文所提算法Line-CNN 后续会更新以下全部算法

本文所提算法如下: 叙述按时间顺序 你也可以把本文当作快速阅读这几篇文献的一个途径 所有重要的部分我都已经标注并弄懂其原理 方便自己也是方便大家 Line-CNN:基于线提议单元的端到端交通线检测 摘要 交通线检测是一项基础且具有挑战性的任务。以往的…

一.android Studio开发系统应用——导入TvSettings源码

目标 最终效果如上,实现在AS中编辑源码后一键在真机中运行。达到和普通应用开发一样的调试和编码过程。这种方法可以大幅度提升开发速度,但是导入过程确实相对繁琐和消耗时间。适合需要精细或者频繁改动的系统app源码。 一、新建项目 包名:com.android.tv.settings 版本:…

20250515让飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG为4线百兆时的接线图

20250515让飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG为4线百兆时的接线图 2025/5/15 20:19 缘起:以前做的网线找不到了,那就再来一条吧。 引脚定义要从头来过?还好找到了一条。 开干! 万用表一对/点,几…

【技术原理】Linux 文件时间属性详解:Access、Modify、Change 的区别与联系

在 Linux 系统中,每个文件都有三个核心时间属性:Access Time (atime)、Modify Time (mtime) 和 Change Time (ctime)。它们分别记录文件不同维度的变更信息,以下是具体区别与联系: 一、定义与触发条件 时间属性定义触发条件示例A…

乘法口诀练习神器

请你利用python语言开发一个“乘法口诀练习神器”,主要辅助小学生练习乘法口诀,主要功能如下: 1. 能够随机循环出10道题,可以是乘法或者是除法。如果是乘法,确保两个因数都是1-9之间的整数;如果是除法&…

[c语言日寄]数据结构:栈

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

磁盘I/O瓶颈排查:面试通关“三部曲”心法

想象一下,你就是线上系统的“交通调度总指挥”,服务器的磁盘是所有数据进出的“核心枢纽港口”。当这个“港口”突然拥堵不堪,卡车(数据请求)排起长龙,进不去也出不来,整个系统的“物流”&#…

基于大模型预测胃穿孔预测与围手术期管理系统技术方案

目录 1. 系统架构模块2. 关键算法实现2.1 术前预测模型(Transformer多模态融合)2.2 术中实时分析(在线学习LSTM)3. 模块流程图(Mermaid)3.1 数据预处理系统3.2 术前预测系统3.3 术中实时分析系统4. 技术验证模块4.1 模型可解释性验证4.2 边缘计算部署架构1. 系统架构模块…

C++:类和对象4

一,日期类实现 学习建议: 对于计算机学习来说,调试十分重要,所以在日常学习中一定要加大代码练习,刷代码题和课后自己敲出课上代码例题,注意不要去对比正确代码或者网上找正确代码直接使用,一…

大数据架构选型分析

选择依据 1.业务需求与技术要求 用户需要根据自己的业务需求来选择架构,如果业务对于Hadoop、Spark、Strom等关键技术有强制性依赖,选择Lambda架构可能较为合适;如果处理数据偏好于流式计算,又依赖Flink计算引擎,那么…

Trae 插件 Builder 模式:从 0 到 1 开发天气查询小程序,解锁 AI 编程新体验

在软件开发领域,效率与创新始终是开发者追求的核心目标。Trae 插件(原 MarsCode 编程助手)Builder 模式的全面上线,无疑为开发者带来了全新的解决方案。它不仅同时支持 VS Code、JetBrains IDEs 等主流开发环境,还能让…

SSM项目集成redis、Linux服务器安装redis

在SSM(Spring Spring MVC MyBatis)项目中引入Redis主要分为以下步骤,确保配置正确并能在业务中灵活使用: 1. 添加Redis依赖​​ 在Maven的pom.xml中添加Spring Data Redis和Jedis(或Lettuce)依赖&#…

【Redis】压缩列表

目录 1、背景2、压缩列表【1】底层结构【2】特性【3】优缺点 1、背景 ziplist(压缩列表)是redis中一种特殊编码的双向链表数据结构,主要用于存储小型列表和哈希表。它通过紧凑的内存布局和特殊的编码方式来节省内存空间。 2、压缩列表 【1…

LocalDateTime类型的时间在前端页面不显示或者修改数据时因为LocalDateTime导致无法修改,解决方案

1.数据库中的时间数据,在控制台可以正常返回,在前端无法返回,即显示空白,如下图所示: 2.这种问题一般时由于数据库和我们实体类的名称不一致引起的,我们数据库一般采用_的方式命名,但是在Java中我们一般采用…

Spring框架核心技术深度解析:JDBC模板、模拟转账与事务管理

一、JDBC模板技术:简化数据库操作 在传统JDBC开发中,繁琐的资源管理和重复代码一直是开发者的痛点。Spring框架提供的 JDBC模板(JdbcTemplate) 彻底改变了这一现状,它通过封装底层JDBC操作,让开发者仅需关注SQL逻辑&a…

Modern C++(一)基本概念

1、基本概念 1.1、注释 注释在翻译阶段3会被替换为单个空白字符从程序中移除 1.2、名字与标识符 标识符是一个由数字、下划线、大小写字符组成的任意长度序列。有效的标识符首个字符必须是以A-Z、a-z、下划线开头,。有效的标识符其他字符可以是0-9、A-Z、a-z、下…

STM32的TIMx中Prescaler和ClockDivision的区别

Prescaler预分频,以笔者目前的学习程度来说,这个参数,一般来说是对主时钟进行分频后的计数器时钟。这个预分频后的时钟主要是用于的计数的。 这个主时钟,对于时基单元来说可以是内部时钟,也可以是外部时钟。一般来说我…

前端性能指标及优化策略——从加载、渲染和交互阶段分别解读详解并以Webpack+Vue项目为例进行解读

按照加载阶段、渲染阶段和交互阶段三个维度进行系统性阐述: 在现代 Web 开发中,性能不再是锦上添花,而是决定用户体验与业务成败的关键因素。为了全面监控与优化网页性能,我们可以将性能指标划分为加载阶段、渲染阶段、和交互阶段…