当前位置: 首页 > news >正文

鸿蒙面试 --- 性能优化

性能优化可以从三个方面入手  感知流畅、渲染性能、运行性能

感知流畅

在应用开发中,动画可以为用户界面增添生动、流畅的交互效果,提升用户对应用的好感度。然而,滥用动画也会导致应用性能下降,消耗过多的系统资源,甚至影响用户体验。

视觉感知优化:应用的卡顿其实就是视觉上出现了不流畅的画面,引起了用户的注意,令其产生了一定的不适感。这也就意味着,在用户操作后,需要第一时间从视觉层面给与反馈响应,从而解决视觉动作带来的不适。

开发者可以在用户的交互动作开始时,从感知角度添加一些动画元素,比如单击效果、转场缩放、加载进度条、共享动画等,这些可以告诉用户目前状态发生了变化,APP在快速地运作着;而动画的背后是:数据的计算,布局的渲染,内容的加载等等,当新界面渲染显示完成,上述动画元素就可通过渐变消失、移出屏外等友好的方式退出视觉区域。

转场场景动效感知流畅 :HarmonyOS系统为开发者提供了丰富的转场动效库,使开发者能够轻松实现各种转场动画效果。开发者可以根据具体需求,在应用的不同场景中应用这些转场动效,以提升用户体验和界面的吸引力。

转场动画分为基础转场和高级模板化转场,有如下几类:

  • 出现/消失转场:对新增、消失的控件实现动画效果,是通用的基础转场效果。
  • 导航转场:页面的路由转场方式,对应一个界面消失,另外一个界面出现的动画效果,如设置应用一级菜单切换到二级界面。关于导航转场案例请参阅导航转场模板实现层级转场。
  • 模态转场:新的界面覆盖在旧的界面之上的动画,旧的界面不消失,新的界面出现,如弹框就是典型的模态转场动画。关于导航转场案例请参阅模态转场模板实现通用转场。
  • 共享元素转场 (一镜到底):共享元素转场是一种界面切换时对相同或者相似的元素做的一种位置和大小匹配的过渡动画效果。
  • 页面转场动画(不推荐):页面的路由转场方式,可以通过在pageTransition函数中自定义页面入场和页面退场的转场动效。为了实现更好的转场效果,推荐使用导航转场和模态转场。
  • 旋转屏动画增强:在原旋转屏动画基础上,可配置渐隐和渐现的转场效果。

合理动画时长使应用感知流畅 :页面的转场动画是提升用户体验的重要环节。然而,当动画时延耗时较长时,它会对用户的点击完成时延产生显著影响。动画的完成时间直接关系到用户何时能够开始与应用进行交互。动画时延影响点击完成时延的根因主要为动画时长设置过长。

常见的页面转场动画时长参数有:

  • Tabs组件设置TabContent切换动画时长,即animationDauration属性。
  • Swiper组件设置子组件切换动画时长,即duration属性。
  • 页面间转场(pageTransition)设置转场动画时长,即PageTransitionOptions对象中的duration字段。具体案例可以参考动画时延场景案例。

使用连贯动画使应用快速响应 :通过多种不同的连贯动画,让应用使用者在操作过程中能够感受到应用的快速响应。

渲染性能 

控制渲染范围、减少布局节点、优化组件绘制、控制状态刷新、优化动画帧率

控制渲染范围

在应用开发实践中,我们可以通过控制UI的渲染范围,从而防止阻塞UI渲染,引发界面卡顿或掉帧现象。

合理控制元素显示与隐藏:使用Visibility.Noneif条件判断等都能够实现该效果。其中if条件判断控制的是组件的创建、布局阶段,visibility属性控制的是元素在布局阶段是否参与布局渲染。

懒加载:LazyForEach是一种延迟加载的技术,它是在需要的时候才加载数据或资源,并在每次迭代过程中创建相应的组件,而不是一次性将所有内容都加载出来。通常应用于长列表优化长列表优化、网格优化、瀑布流优化等数据量较大、子组件可重复使用的场景,当用户滚动页面到相应位置时,才会触发资源的加载,以减少组件的加载时间,提高应用性能,提升用户体验。

懒加载可以通过设置cachedCount来指定缓存数量,在设置cachedCount后,除屏幕内显示的Item组件外,还会预先将屏幕可视区外指定数量的数据缓存。

组件复用:组件复用是优化用户界面性能,提升应用流畅度的一种重要手段,通过复用已存在的组件节点而非创建新的节点,从而确保UI线程的流畅性与响应速度。组件复用针对的是自定义组件,只要发生了相同自定义组件销毁和再创建的场景,都可以使用组件复用,例如长列表优化、瀑布流优化、Swiper组件优化等场景,

复用类型

描述

复用思路

标准型

复用组件之间布局完全相同

标准复用

有限变化型

复用组件之间布局有所不同,但是类型有限

使用reuseId或者独立成不同自定义组件

组合型

复用组件之间布局有不同,情况非常多,但是拥有共同的子组件

将复用组件改为@Builder,让内部子组件相互之间复用

全局型

组件可在不同的父组件中复用,并且不适合使用@Builder

使用BuilderNode自定义复用组件池,在整个应用中自由流转

嵌套型

复用组件的子组件的子组件存在差异

采用化归思想将嵌套问题转化为上面四种标准类型来解决

 分帧渲染:在应用开发中,页面内列表结构复杂,每个列表项包含的组件较多,就会导致嵌套层级较深,从而引起组件负载加重,绘制耗时增长。

减少布局节点

在进行页面布局开发时,应该尽量减少布局节点,避免系统绘制更多的布局组件,达到优化渲染性能、减少内存占用的目的。

优先使用@Builder方法代替自定义组件:由于@Builder不涉及生命周期,在自定义组件大量嵌套的场景中,更加轻量级的@Builder在性能方面更加出色。因此当自定义组件不涉及到状态变量和自定义生命周期时,可以优先使用@Builder替换自定义组件,提升性能。

合理使用布局容器组件:在进行UI布局时,子组件会根据父组件的布局算法得到相应的排列规则,然后按照规则进行子组件位置的摆放。不同的布局容器使用的布局算法对性能带来的影响不同。开发者应该根据场景选用合适的布局,除非必须,尽量减少使用性能差的布局组件

精简节点数:在进行UI布局时,在布局测算阶段下,额外的节点数将导致更多的计算过程,造成性能消耗。应该移除冗余节点来精简节点数,主要有如下几种优化方式:

  • 移除冗余节点、使用扁平化布局减少节点数。具体案例请参阅移除冗余节点。
  • 自定义组件自身为非渲染节点,仅是组件树和状态数据的组合,常规使用自定义组件时并不会产生多余的节点。但是给自定义组件添加属性后,会将自定义组件作为一个整体节点进行处理。需通过优化手段减少自定义组件产生多余节点。
  • 在组件嵌套的情况中,可以找到一些无用的容器组件嵌套。在考虑组件嵌套优化中,可以删除无用的Stack/Column/Row嵌套,移除冗余节点,从而避免冗余节点对性能的消耗。
  • 实际上有些场景直接使用组件属性或借助系统API的能力就能实现,例如使用overlay属性可以实现浮层场景,使用ColorMetrics可以实现颜色叠加效果。优先使用组件属性代替嵌套组件方式可以减少布局嵌套组件的使用,从而精简节点数。

优化组件绘制

应用启动后页面加载和渲染的性能与FrameNode树上的节点数量以及每个节点上的属性相关。因此,为缩短页面加载和布局渲染时长,在前端使用UI组件时可以考虑以下优化方案。

避免在定义组件生命周期内执行高耗时操作:自定义组件生命周期如图所示,自定义组件创建完成之后,在build函数执行之前,将先执行aboutToAppear()生命周期回调函数。此时若在该函数中执行耗时操作,将阻塞UI渲染,增加UI主线程负担。因此,应尽量避免在自定义组件的生命周期内执行高耗时操作。

按需注册组件属性 :在使用组件开发应用UI界面时,会为每个组件设置属性,进行UI样式、行为等逻辑处理。当应用中单个组件设置了大量属性且该组件在应用中被大量使用时,单个属性的设置对应用的整体性能会产生较大影响。

减少布局计算:对于组件的宽高不需要自适应的情况下,建议在UI描述时给定组件的宽高数值

控制状态刷新

在声明式UI编程范式中,UI是应用程序状态的函数,应用程序状态的修改会更新相应的UI界面。ArkUI采用了MVVM模式,其中ViewModel将数据与视图绑定在一起,更新数据的时候直接更新视图。

ArkUI提供了一系列装饰器实现ViewModel的能力,如@Prop、@Link、@Provide、LocalStorage等。当自定义组件内变量被装饰器装饰时变为状态变量,状态变量的改变会引起UI的渲染刷新。 

避免不必要的状态变量使用 :

  • 状态变量的管理有一定的开销,应在合理场景使用,普通的变量用状态变量标记可能会导致性能劣化,应删除冗余的状态变量标记。
  • 通过使用临时变量的计算代替直接操作状态变量,可以使ArkUI仅在最后一次状态变量变更时查询并渲染组件,建议使用临时变量替换状态变量,减少不必要的行为,从而提高应用性能。

最小化状态共享范围 :

  • 状态变量使用范围不当,可能会带来冗余刷新的性能问题。
  • 在没有强烈的业务需求下,尽可能按照状态需要共享的最小范围选择合适的装饰器实现最小化状态共享范围。应用开发过程中,按照组件颗粒度,状态一般分为组件内独享的状态和组件间需要共享的状态。

减少不必要的参数层层传递 :当共享状态的组件间层级相差较大时,会出现状态层层传递的现象。对于状态传递过程中途经的全部组件,都需要增加入参接收该状态再将状态传递给子组件,因此应减少不必要的参数层层传递并按照状态复杂度选择装饰器。

精细化拆分复杂状态 :对于AppStorage的使用,由于其作用范围最广,开发者为了方便开发容易将各种状态存入其中以达到共享的目的,这通常会造成大量的性能损失

集中化状态修改逻辑:当多个子组件修改状态的逻辑基本相同时,建议将状态的修改集中到单个函数中,以提升逻辑的可复用性、代码的可维护性和可测试性。

使用监听和订阅精准控制组件刷新:在多个组件依赖同一个数据源并根据数据源变化刷新组件的情况下,直接关联数据源会导致每次数据源改变都刷新所有组件。为精准控制组件刷新,可以采取以下策略:

  • 在组件中使用 @Watch 装饰器监听数据源,当数据变化时执行业务逻辑,确保只有满足条件的组件进行刷新。
  • 当组件关系复杂或跨越层级过多时,推荐使用EventHub或者Emitter实现自定义事件发布订阅。当数据源改变时发布事件,依赖该数据源的组件通过订阅事件来获取数据源的改变,完成业务逻辑的处理,从而实现组件的精准刷新。

优化动画帧率

动画在应用开发中扮演着重要的角色,能够提升用户体验,传达信息,引导用户操作,提升应用品质和增加视觉吸引力。而动画的性能表现也至关重要,优化可以从属性更新和布局等几个方面考虑,尽可能减少冗余刷新。

使用系统提供的动画接口:一般而言,在HarmonyOS应用开发中,动画设计实现可以通过自定义动画或系统提供的动画接口两种方式来实现。系统接口经过精心设计和优化,使用系统提供的动画接口能够在不同设备上提供流畅的动画效果,最大程度地减少丢帧率和卡顿现象。

使用图形变换属性变化组件:通过使用图形变换属性变化组件,而不是直接修改组件的布局属性,可以减少不必要的布局计算和重绘操作,从而降低丢帧率,提升动画的流畅度和响应速度。

 合理使用animateTo:

  • 在组件中每次调用animateTo方法,都会触发一次属性变化,这意味着在每次动画执行时都需要进行动画前后的对比,以确定属性的变化情况。当多次连续调用animateTo时,会增加额外的布局计算和绘制开销,从而降低性能表现。在实际开发中,如果多个属性需要以相同的动画参数进行变化,推荐将它们放到同一个动画闭包中执行,即参数相同时使用同一个animateTo。
  • 在进行多次动画操作时,统一更新状态变量可以避免不必要的状态更新和重复渲染,从而减少性能开销。如果多个animateTo之间存在状态更新,会导致执行下一个animateTo之前又存在需要更新的脏节点,可能造成冗余更新,因此应该多次animateTo时统一更新状态变量。

 使用renderGroup缓存动效:在单一页面上存在大量应用动效的组件时,可以使用renderGroup来解决卡顿问题,从而提升动画性能。首次绘制组件时,若组件被标记为启用renderGroup状态,将对组件和其子组件进行离屏绘制,将绘制结果进行缓存。此后当需要重新绘制组件时,就会优先使用缓存而不必重新绘制,从而降低绘制负载,优化渲染性能。

运行性能

使用并发能力、提前加载资源、提高运行效率、减少耗时操作、延时触发操作

使用并发能力

应用中的并发优化就是在响应用户操作期间,尽可能地让主线程只执行UI绘制相关的任务,而将非UI的耗时任务分配给其他线程或者延迟处理。这样借助多线程的异步技术,充分利用多核处理器的能力,提高应用程序的并发处理能力,减少用户等待时间,保证用户界面的响应流畅性。

 使用多线程能力:自定义组件创建完成之后,在build函数执行之前,将先执行aboutToAppear()生命周期回调函数。此时若在该函数中执行耗时操作,将阻塞UI渲染,增加UI主线程负担。

对于不需要等待结果的高耗时任务,可以使用多线程处理该任务,通过并发的方式避免主线程阻塞;也可以把耗时操作改为异步并发或延后处理,保证主线程优先处理组件绘制逻辑。ArkTS提供了TaskPool与Worker两种多线程并发方案,具体两种并发方案区别对比请参阅TaskPool和Worker的对比实践。

【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案”-CSDN博客

使用异步能力:Promiseasync/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次I/O任务的场景开发,例如一次网络请求、一次文件读写等操作。无需另外启动线程执行。可以把耗时操作的执行从同步执行改为异步或者延后执行,比如使用setTimeOut执行耗时操作实现应用冷启动优化。

HarmonyOs DevEco Studio小技巧24--异步编程(Promises、async/await)_harmonyos await-CSDN博客

 多线程间通信:对象/方法在跨线程传递时均会涉及到其序列化和反序列化的过程。当对象本身较大且结构复杂时,序列化/反序列化的耗时就会增加,从而影响应用运行的整体性能。使用异步能力Sendable对象可以实现数据在多线程间的引用传递,具体使用场景请参阅Sendable使用场景与案例分析。

提前加载资源

网络请求优化:在附带网络请求的页面跳转场景中,完成时延耗时长的绝大多数原因都是因为网络数据Http请求时间长。由于网络是从操作系统侧发起和控制的,且网络环境存在不可控性,所以我们很难在业务逻辑的代码中优化请求速度。因此应尽可能的提前发起网络请求。

Web组件的预连接、预加载、预渲染 :当遇到Web页面加载慢的场景,可以使用Web组件的预连接、预加载、预渲染能力,在应用空闲时间提前进行Web引擎初始化和页面加载,提升下一页面的启动和响应速度,具体原理与案例请参阅Web组件开发性能提升指导。

预下载优化Image白块 :为了减少白块的出现,开发者可以采用预下载的方式,将网络图片通过应用沙箱的方式进行提前缓存,将图片下载解码提前到组件创建之前执行,当Image组件加载时从应用沙箱中获取缓存数据。非首次请求时会判断应用沙箱里是否存在资源,如存在直接从缓存里获取,不再重复下载,减少Image加载大的网络图片时白屏或白块出现时长较长的问题,提升用户体验。

提高运行效率 

在语法使用过程中,通过优化一些影响性能的代码片段,使代码以最优的方式执行提高运行效率。

变量声明 :

  • 对于初期明确不会改变的变量,尽量使用const声明常量。这里的常量包含基础类型和引用类型。通过const保证地址不会发生变化,能够极大减少由于编码时误操作导致的赋值等行为,造成对原有逻辑的改变,声明为const能够在编辑时及时发现错误。
  • 对于number类型,编译器在优化时会区分int和double类型。开发者在初始化number类型的变量时指定number的类型,如果预期是整数类型就初始化为0小数类型就初始化为0.0,避免将一个number类型初始化为undefined或者null。
  • ESObject主要用于在ArkTS和TS/JS跨语言调用的场景中作为类型标注,在非跨语言场景中使用ESObject标注类型,会引入不必要的跨语言调用,造成额外的性能开销,建议在非跨语言调用的场景下减少使用ESObject,引入明确的类型进行注释。

属性访问 :

  • 在要求性能的场景下,建议通过使用将全局变量存储为局部变量的方式来减少变量的属性查找,因为访问局部变量的速度要比访问全局变量的速度更快。重复的访问同一个变量,将造成不必要的消耗,尤其当类似的访问出现在循环过程中,其对于性能的影响更大。
  • 在ArkTS中,对于类结构的属性提供了private、protected和public可访问修饰符。默认情况下一个属性的可访问修饰符为public。给类属性添加访问修饰符选取适当的可访问修饰符可以提升代码的安全性、可读性。

 数值计算与数据结构:

  • 如果是纯数值计算的场合,推荐数值计算使用TypedArray数据结构。TypedArray类型化数组是一种类似数组的对象,其提供了一种用于在内存缓冲中访问原始二进制数据的机制。在一些图像数据处理、加解密的数据计算过程中使用TypedArray可以提高数据处理的效率,因为TypedArray是基于ArrayBuffer实现,在性能方面也能够进行较大提升。
  • 通过选取合适的数据结构提高运行效率。例如有些时候会采用Record的方式作为临时容器来处理属性存取的逻辑,HashMap是ArkTS提供的高性能容器类,底层使用红黑树实现,提供了高性能的数据读写操作,可以用来实现快速读写键值。

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

  • 由于依赖模块解析采用深度优先遍历的方式来遍历模块依赖关系图中每一个模块记录,会先从入口文件的第一个导入语句开始一层层往更深层查找,直到最后一个没有导入语句的模块为止,连接好这个模块的导出变量之后又会回到上一级的模块重复这个步骤,因此减少使用嵌套export *的方式全量导出,降低依赖模块解析、文件执行阶段耗时增长。
  • 当工具类中存在较多暴露函数或变量时,推荐按需引用使用到的变量减少import *的方式全量引用,可以减少该阶段中.ets文件执行耗时,即减少文件中所有export变量的初始化过程。

这里的话 导出我们有一个统一资源管理的文件 index

减少耗时操作 

在应用开发实践中,有效避免主线程执行冗余与易耗时操作是至关重要的策略。此举能有效降低主线程负载,提升UI的响应速度。

避免主线程冗余操作:在软件开发中,冗余操作指的是那些不必要、重复执行且对程序功能无实质性贡献的操作。这些操作不仅会浪费计算资源,还可能降低程序的运行效率,特别是在高频调用的场景下,其负面影响更为显著。

避免高频回调执行耗时操作:高频回调接口通常是指在应用程序运行过程中会被频繁触发的事件或回调函数。

避免使用耗时接口:

  • 在应用开发中,经常会调用系统提供的接口,比如读取本地文件、处理服务端数据等等。若对耗时接口使用不合理,可能引起延迟、卡顿、丢帧等性能问题。具体案例可参阅避免使用耗时接口。
  • 通过系统框架封装的API,可以对数据及其结构进行访问、管理、增添或更新等一系列操作。通常来讲,数据库的调用会比较耗时,常见的增、删、改、查等都提供了异步接口,合理使用这些接口不会对响应性能产生影响。具体案例与性能实验数据请参阅减少调用数据库API次数。

延时触发操作 

延迟加载Lazy-Import与动态加载await import:随着应用功能持续增加,应用规模不断扩大,依赖的模块文件逐渐变多,应用冷启动加载模块的时间也越来越长。

  • 动态加载(动态import)是一种模块加载机制,允许应用程序在运行时按照实际需求去加载相关模块。在某些条件满足时(比如用户交互时,或ABTest分支切换时)再加载特定模块,可以减少初始化import的加载时间和资源消耗,这将有助于提高应用程序的内存性能和响应速度。
  • 以通过延迟加载 Lazy-Import 的方法延缓对这些冗余文件的加载,使待加载文件在冷启动阶段不被加载,而在后续导出变量被真正使用时再同步加载执行文件,节省资源以提高应用冷启动性能。具体案例与实验数据请参阅延迟加载Lazy-Import使用指导。

延迟执行资源释放操作 :将资源关闭和释放操作放在setTimeout函数中执行,使其延迟到系统相对空闲的时刻进行,可以避免在程序忙碌时段占用关键资源,提升整体性能及响应能力。例如相机正常使用后,延迟执行释放相机资源的相关操作。

相关文章:

鸿蒙面试 --- 性能优化

性能优化可以从三个方面入手 感知流畅、渲染性能、运行性能 感知流畅 在应用开发中,动画可以为用户界面增添生动、流畅的交互效果,提升用户对应用的好感度。然而,滥用动画也会导致应用性能下降,消耗过多的系统资源,…...

【逐行注释】自适应观测协方差R的AUKF(自适应无迹卡尔曼滤波,MATLAB语言编写),附下载链接

文章目录 自适应R的UKF逐行注释的说明运行结果部分代码各模块解释 自适应R的UKF 自适应无迹卡尔曼滤波(Adaptive Unscented Kalman Filter,AUKF)是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波(Unscented Kalman Filter&…...

mac下安装Ollama + Open WebUI + Llama3.1

本文介绍mac下安装Ollama Open WebUI Llama3.1 8b具体步骤。 目录 推荐配置Ollama Open WebUI Llama3.1简介安装Ollama安装Open WebUI 推荐配置 m1以上芯片,16g内存,20g以上硬盘空间 Ollama Open WebUI Llama3.1简介 Ollama: 下载,管理…...

Python Tornado框架教程:高性能Web框架的全面解析

Python Tornado框架教程:高性能Web框架的全面解析 引言 在现代Web开发中,选择合适的框架至关重要。Python的Tornado框架因其高性能和非阻塞I/O特性而备受青睐。它特别适合处理大量并发连接的应用,比如聊天应用、实时数据处理和WebSocket服务…...

QT-installEventFilter

installEventFilter 是 Qt 框架中的一个方法,用于在对象之间建立事件过滤机制。具体来说,它允许一个对象(称为事件过滤器)监视另一个对象(称为被监视对象)的事件,并在这些事件被处理之前对其进行…...

ZYNQ详解

ZYNQ是Xilinx公司推出的一系列SoC(System-on-Chip,系统级芯片)产品家族,它将传统的FPGA(可编程逻辑器件)与嵌入式处理器相结合,形成了一种集成了硬件和软件处理能力的单一芯片解决方案。以下是对…...

代码随想录打卡DAY21

算法记录第21天 [二叉树] 1.LeetCode 538. 把二叉搜索树转换为累加树 题目描述: 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原…...

LeetCode【代码随想录】刷题(数组篇)

704.二分查找 力扣题目链接 题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 思路:简单的二…...

Python知识第十二天分享

假设有一个文件 num.txt,里面存储了如下的一些数字,内容如下: 10 18 30 11 12 15 编写一个 python 程序,读取文件中的内容,存储成 python 中的列表形式: sum 0 with open(./num.txt, r) as nu_f:list1 …...

[SWPUCTF 2021 新生赛]easy_md5

借鉴博客 [SWPUCTF 2021 新生赛]easy_md5_青少年ctf easymd5-CSDN博客 我们直接看见源码 <?php highlight_file(__FILE__);include flag2.php;if (isset($_GET[name]) && isset($_POST[password])){$name $_GET[name];$password $_POST[password];if ($name …...

C# 开发应用篇——C# 基于WPF实现数据记录导出excel详解

目录 引言 一、基于 EPPlus 库实现WPF导出EXCEL功能 项目准备 创建 WPF 界面 后端代码 EPPlus LicenseContext 属性设置 关键点说明 二、基于 ClosedXML 库实现WPF导出EXCEL功能 安装 ClosedXML 使用 ClosedXML 创建和操作 Excel 文件 读取 Excel 文件 常…...

MongoDB相关问题

视频教程 【GeekHour】20分钟掌握MongoDB Complete MongoDB Tutorial by Net Ninja MongoDB开机后调用缓慢的原因及解决方法 问题分析&#xff1a; MongoDB开机后调用缓慢&#xff0c;通常是由于以下原因导致&#xff1a; 索引重建&#xff1a; MongoDB在启动时会重建索引…...

从入门到精通数据结构----四大排序(上)

目录 首言&#xff1a; 1. 插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 3. 交换排序 3.1 冒泡排序 3.2 快排 结尾&#xff1a; 首言&#xff1a; 本篇文章主要介绍常见的四大排序&#xff1a;交换排序、选择排序、插入排序、归并排…...

数据结构-堆的实现和应用

目录 1.堆的概念 2.堆的构建 3.堆的实现 4.堆的功能实现 4.1堆的初始化 4.2堆的销毁 4.3堆的插入 4.3.1向上调整 4.4堆的删除 4.4.1向下调整法 ​编辑4.5取堆顶 5. 向上调整法和向下调整法比较 6.堆的应用 6.1TOP-K问题 6.2TOP-K思路 6.2.1用前n个数据来建堆 6.…...

Spring MVC

1. 用户发起请求 用户行为&#xff1a;用户在浏览器中输入URL或点击链接&#xff0c;向Web服务器&#xff08;如Tomcat&#xff09;发起一个HTTP请求。请求传输&#xff1a;请求被发送到Web容器&#xff0c;Web容器根据配置将请求转发给DispatcherServlet。 2. 前端控制器&am…...

linux ubuntu的脚本知

目录 一、变量的引用 二、判断指定的文件是否存在 三、判断目录是否存在 四、判断最近一次命令执行是否成功 五、一些比较符号 六、"文件"的读取和写入 七、echo打印输出 八、ubuntu切换到root用户 九、后台进程的控制 N、其它可以参考的网址 脚本功能强大…...

Spring Boot 动态数据源切换

背景 随着互联网应用的快速发展&#xff0c;多数据源的需求日益增多。Spring Boot 以其简洁的配置和强大的功能&#xff0c;成为实现动态数据源切换的理想选择。本文将通过具体的配置和代码示例&#xff0c;详细介绍如何在 Spring Boot 应用中实现动态数据源切换&#xff0c;帮…...

Design Linear Filters in the Frequency Domain (MATLAB帮助文档)

Design Linear Filters in the Frequency Domain 这个帮助文档写得很好&#xff0c;简单明了&#xff0c;一句废话没有。 This topic describes functions that perform filtering in the frequency domain. 2-D Finite Impulse Response (FIR) Filters The Image Processi…...

Java知识及热点面试题总结(二)

1、什么是死锁(deadlock)? 两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。 如何避免线程死锁? 只要破坏产生死锁的四个条件中的其中一个就可以了。 破坏互斥条件&#xff1a;这个条件我们没有办法…...

开源加密库mbedtls及其Windows编译库

目录 1 项目简介 2 功能特性 3 性能优势 4 平台兼容性 5 应用场景 6 特点 7 Windows编译 8 编译静态库及其测试示例下载 1 项目简介 Mbed TLS是一个由ARM Maintained的开源项目&#xff0c;它提供了一个轻量级的加密库&#xff0c;适用于嵌入式系统和物联网设备。这个项…...

架构01-演进中的架构

零、文章目录 架构01-演进中的架构 1、原始分布式时代&#xff1a;Unix设计哲学下的服务探索 &#xff08;1&#xff09;背景 时间&#xff1a;20世纪70年代末到80年代初计算机硬件&#xff1a;16位寻址能力、不足5MHz时钟频率的处理器、128KB左右的内存转型&#xff1a;从…...

npm-运行项目报错:A complete log of this run can be found .......npm-cache_logs\

1.问题 没有找到对应的某种依赖&#xff0c;node_modules出现问题。 2.解决 (1)查看对应依赖是否引入或者是由于合并分支错误 引入js或依赖不存在。谨慎删除依赖包 (2)查找对应引入依赖进行安装最后解决方法-删除依赖包清除缓存 npm cache clean --force (2)重新向同事引入…...

C++中的函数对象

C 中函数对象的定义和特点 定义&#xff1a;函数对象&#xff08;Function Object&#xff09;也叫仿函数&#xff08;Functor&#xff09;&#xff0c;是一个类&#xff0c;这个类重载了函数调用运算符()。当创建这个类的对象后&#xff0c;可以像使用函数一样使用这个对象&am…...

godot游戏引擎_瓦片集和瓦片地图介绍

在 Godot 中&#xff0c;TileSet 和 TileMap 是用于处理瓦片地图的两个关键概念&#xff0c;它们的作用和用途有明显的区别。以下是两者的详细对比&#xff1a; 1. TileSet&#xff08;瓦片集&#xff09; TileSet 是资源&#xff0c;定义瓦片的内容和属性。 特点&#xff1a…...

[C++ 核心编程]笔记 4.1 封装

4.1.1 封装的意义 封装是C面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体&#xff0c;表现生活中的事物将属性和行为加以权限控制 封装意义一: 在设计类的时候&#xff0c;属性和行为写在一起&#xff0c;表现事物 语法: class 类名{ 访问权限: 属性 /行为 }…...

学习使用jquery实现在指定div前面增加内容

学习使用jquery实现在指定div前面增加内容 设计思路代码示例 设计思路 选择要添加内容的指定元素‌&#xff1a; 使用jQuery选择器来选择你希望在其前添加内容的元素。例如&#xff0c;如果你有一个 元素&#xff0c;其ID为qipa250&#xff0c;你可以使用$(‘#qipa250’)来选择…...

如何写出好证明(支持思想的深入数学写作)

不断的修改和精炼是写作过程中的重要环节&#xff0c;数学写作最终目的是提供对问题的深刻洞察而非仅仅陈述细节。 根据harvey mudd college Francis Su教授的《GUIDELINES FOR GOOD MATHEMATICAL WRITING》讲稿&#xff0c;总结出撰写好的数学证明需要注意以下几个要点&#x…...

基于边缘智能网关的机房安全监测应用

随着我国工业互联网的扎实推进&#xff0c;越来越多地区积极建设信息基础设施&#xff0c;以充沛算力支撑产业物联网的可持续发展&#xff0c;数据机房就是其中的典型代表。而且随着机房规模的扩大&#xff0c;对于机房的安全管理难题挑战也日益增加。 面向数据机房安全监测与管…...

在WSL 2 (Ubuntu 22.04)安装Docker Ce 启动错误解决

查看WSL版本 在 Windows 命令提示符&#xff08;CMD&#xff09;或 PowerShell 中&#xff0c;你可以使用以下命令来查看已安装的 WSL 发行版及其版本信息&#xff1a; wsl -l -v(base) PS C:\Users\Lenovo> wsl -l -vNAME STATE VERSION * Ubuntu-2…...

【RISC-V CPU debug 专栏 3 -- Debugging RISC-V Cores】

文章目录 RISC-V 调试规范开源与多样性挑战调试规范的重要性外部调试支持的主要组件调试功能Lauterbach 的贡献RISC-V 调试规范 调试 RISC-V 内核涉及许多独特的挑战,这是由 RISC-V 的开源特性和多样化的生态系统所决定的。为了避免专有调试接口的泛滥,RISC-V 基金会内的工作…...

Unity Banner广告后面自定义背景,高度适配

目的是实现这个&#xff0c;代码放下面 已经测试十几台设备包括pad没问题 以Max聚合为例 展示&#xff08;关闭&#xff09;Banner的时候调用Show&#xff0c;Banner加载成功回调里调用RefreshSizeDelta 最终获得是像素 所以UGUI的Canvas使用Constant Pixel Size模式&#xff0…...

【技术文档:技术传播的灯塔】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

git的使用(简洁版)

什么是 Git&#xff1f; Git 是一个分布式版本控制系统 (DVCS)&#xff0c;用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建&#xff0c;最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具&#xff0c;使得开发者…...

数据库编程(sqlite3)

一&#xff1a;数据库分类 常用的数据库 大型数据库 &#xff1a;Oracle商业、多平台、关系型数据库功能最强大、最复杂、市场占比最高的商业数据库 中型数据库 &#xff1a;Server是微软开发的数据库产品&#xff0c;主要支持windows平台 小型数据库 : mySQL是一个小型关系型…...

Python 中如何处理异常?

在Python中&#xff0c;异常处理是一种重要的编程技术&#xff0c;它允许开发者优雅地处理程序运行过程中出现的错误或异常情况&#xff0c;而不是让程序直接崩溃。 通过异常处理&#xff0c;我们可以使程序更加健壮、用户友好。 异常处理的基本结构 Python中最基本的异常处…...

RHCE——nfs网络文件系统

简介 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09;是FreeBSD支持的文件系统中的一种&#xff0c;它允许网络中的计算机&#xff08;不同的计算机、不同的操作系统&#xff09;之间通过TCP/IP网络共享资源&#xff0c;主要在unix系列操作系统上使用…...

【人工智能】Python常用库-Scikit-learn常用方法教程

Scikit-learn 是一个功能强大的机器学习库&#xff0c;支持数据预处理、分类、回归、聚类、降维等功能&#xff0c;广泛用于模型开发与评估。以下是 Scikit-learn 的常用方法及详细说明。 1. 安装与导入 安装 Scikit-learn&#xff1a; pip install scikit-learn导入基本模块…...

sargo 官方镜像刷机

资料 官方镜像https://developers.google.cn/android/images?hlzh-cn zip镜像 https://googledownloads.cn/dl/android/aosp/sargo-rq3a.211001.001-factory-2a1befea.zip 使用 fastboot 刷写 下载好的镜像 步骤 先使用命令 adb reboot bootloader 再使用./falsh-all.sh 命…...

解决首次加载数据空指针异常

起初效果&#xff1a; 使用async...await异步加载数据 最终效果&#xff1a; 代码&#xff1a; <template><div class"user-list-container"><!-- 加载状态 --><div v-if"loading" class"loading">正在加载用户数据..…...

BERT的中文问答系统35

优化GUI布局、显示问答内容、增加自动搜索功能等。以下是完整的项目结构和代码&#xff1a; 项目结构 xihe241117/ ├── data/ │ └── train_data.jsonl ├── logs/ ├── models/ │ └── xihua_model.pth ├── requirements.txt ├── README.md └── 智…...

若依框架部署在网站一个子目录下(/admin)问题(

部署在子目录下首先修改vue.config.js文件&#xff1a; 问题一&#xff1a;登陆之后跳转到了404页面问题&#xff0c;解决办法如下&#xff1a; src/router/index.js 把404页面直接变成了首页&#xff08;大佬有啥优雅的解决办法求告知&#xff09; 问题二&#xff1a;退出登录…...

DB2数据库

DB2数据库是IBM公司开发的一种关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它支持多种数据模型&#xff0c;包括关系模型、文档模型、图模型等。DB2最初是为大型机环境设计的&#xff0c;但现在它已扩展到各种平台&#xff0c;包括Windows、Linux和Unix等&…...

python excel接口自动化测试框架!

今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件&#xff0c;得到测试信息&#xff0c;然后通过封装的requests方法&#xff0c;用unittest进行测试。 其中&#xff0c;接口关联的参数通过正则进…...

Spring框架整合单元测试

目录 一、配置文件方式 1.导入依赖 2.编写类和方法 3.配置文件applicationContext-test.xml 4.测试类 5.运行结果 二、全注解方式 1.编写类和方法 2.配置类 3.测试类 4.运行结果 每次进行单元测试的时候&#xff0c;都需要编写创建工厂&#xff0c;加载配置文件等相关…...

Java部分新特性

模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...

keepalived+lVS(dr)高可用集群

keepalivedlVS(dr)高可用集群 规划 服务器名称IP描述masterkeepalivedlvsVIP:192.168.238.100DIP:192.168.238.151keepalived的master节点和lvs负载均衡backupkeepalivedlvsVIP:192.168.238.100DIP:192.168.238.152keepalived的备份节点和lvs负载均衡server1VIP:192.168.238.…...

【前端】JavaScript中的柯里化(Currying)详解及实现

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;什么是柯里化&#xff1f;&#x1f4af;柯里化的特点&#x1f4af;柯里化的简单示例&#x1f4af;通用的柯里化实现&#x1f4af;柯里化让代码更易读的原因&#x1f4af…...

Cyberchef 辅助网络安全运营-数据格式转换

在网络安全的世界中&#xff0c;经常会遇到各种格式的数据&#xff0c;比如二进制&#xff0c;比如说16进制&#xff0c;URL编码&#xff0c;HTML编码&#xff0c;Unicode编码&#xff0c;Base格式的编码。网络安全运营一个明确的目标就是把这些不同的数据格式换成为可读的字符…...

鸿蒙面试 --- 性能优化(精简版)

一、性能优化的三个方面 感知流畅&#xff1a;通过合理运用动画提升用户对应用操作的感知流畅度&#xff0c;同时避免因动画滥用导致性能下降。涵盖视觉感知优化、转场场景动效感知流畅&#xff08;如出现 / 消失转场、导航转场、模态转场、共享元素转场等&#xff09;&#x…...

qsort函数详解+代码展示

文章目录 概要系列文章目录前言(1) 定义(2) 使用&#xff08;举例子 上代码&#xff09;1、定义数组&#xff1a;2、定义比较函数&#xff1a;3、调用 qsort&#xff1a;4、输出结果&#xff1a; (3) 注意事项 小结 概要 本篇博客将详细地介绍qsort排序函数&#xff0c;&#x…...