React是如何利用堆进行任务调度的?

简介: React利用堆进行任务调度

网络异常,图片无法展示
|


最近一直在做 LeetCode 题解的相关输出,


有的小伙伴可能会有疑惑,学了算法后,在前端中有哪些地方用到了算法呢?


今天我们就来聊一聊 React 中是如何利用堆维护任务队列的。


业务场景


React 中有很多任务,


例如 用户点击、用户输入以及 setState 等等,而这些任务又有优先级的区分。


比如用户的点击和输入,肯定是高优先级任务,要优先响应,


load 以及 animation 事件的优先级肯定要低一些。


如果队列中有了一些低优先级任务,此时新进来的高优先级任务就要插队执行,那么 React 是如何管理这些任务的呢?


源码地址


React 源码中有目录 packages/scheduler,该目录就是 React 任务调度模块相关。


该目录 src


Scheduler.js 实现了任务调度相关逻辑


SchedulerMinHeap.js 实现了堆


小顶堆任务调度


React 会有一系列规则定义每个任务的优先级,最后的表现就是 React 会将每个任务包装为一个任务对象 newTask 319行,该对象会存在两个属性 idsortIndex


其中 sortIndex 标识当前任务的优先级, id 标识每个任务的先后顺序。


React 中存放任务的数组 taskQueue 会被模拟为一个小顶堆,


该小顶堆的 compare 逻辑是优先比较 sortIndex(即任务的优先级),


如果 sortIndex 相同,则比较 id(即任务创建的先后顺序)。


因为堆的性质是维护一个最值在堆顶,所以每次堆顶任务(对应任务数组中的第一个元素)就是当前任务队列中优先级最高的任务,这样只需要每次获取堆顶任务执行即可。


堆顶任务取出之后,只需要对小顶堆进行弹堆操作后自上向下的平衡调整,则堆顶又维护了当前任务队列中优先级最高的任务。


这样通过堆维护任务队列,每次获取优先级最高的任务的时间复杂度是 O(1) 的,插入和弹出操作后的平衡调整时间复杂度是 O(logn)的,整体是非常高效的。


end


以上就是堆在 React 任务调度中的应用,你学会了吗?

相关文章
|
7月前
|
前端开发 JavaScript 中间件
React状态管理库—— zustand 为啥这么简单易用🚀
React状态管理库—— zustand 为啥这么简单易用🚀
|
9月前
|
前端开发
前端学习笔记202307学习笔记第五十九天-react源码-Fiber数据结构介绍2
前端学习笔记202307学习笔记第五十九天-react源码-Fiber数据结构介绍2
38 0
|
8天前
|
缓存 前端开发 架构师
理解这个机制,是成为React性能优化高手的关键
理解这个机制,是成为React性能优化高手的关键
|
8天前
|
存储 前端开发 JavaScript
React 性能优化终章,成为顶尖高手的最后一步
React 性能优化终章,成为顶尖高手的最后一步
|
8天前
|
前端开发
React组件性能优化
React组件性能优化
|
9月前
|
前端开发
前端学习笔记202307学习笔记第五十九天-react源码-Fiber数据结构介绍
前端学习笔记202307学习笔记第五十九天-react源码-Fiber数据结构介绍
54 0
|
9月前
|
前端开发
前端学习笔记202307学习笔记第六十天-react源码-构建单个子集fiber的情况2
前端学习笔记202307学习笔记第六十天-react源码-构建单个子集fiber的情况2
31 0
|
9月前
|
前端开发
前端学习笔记202307学习笔记第六十天-react源码-构建多个子集fiber的情况
前端学习笔记202307学习笔记第六十天-react源码-构建多个子集fiber的情况
34 0
|
10月前
|
前端开发 JavaScript UED
React 组件生命周期及优化技巧
在 React 中,组件生命周期是组件从创建到销毁的一系列过程。在这个过程中,React 提供了许多钩子函数,允许我们在组件的不同阶段执行特定的操作。优化组件生命周期可以提高应用程序性能和用户体验。下面是 React 组件生命周期及优化技巧的详细介绍:
|
10月前
|
前端开发
react性能优化的方法
react性能优化的方法
93 0

热门文章

最新文章