React16源码: React中的expirationTime过期时间的计算源码实现

Cursor集成Claude 4.6免费版:本地IDE合规调用指南 大语言模型编程助手(LLM Copilot)已成为现代开发标配,其核心能力依赖于上下文理解、代码推理与结构化输出等关键技术原理。Anthropic官方提供的Claude系列模型,尤其Claude 4.6,凭借200K超长上下文、tool use函数调用和严格可控的API设计,在工程实践中展现出显著技术价值。该能力可无缝嵌入本地IDE环境,支撑代码解释、跨文件分析、单元测试生成等高频开发场景。本文聚焦Cursor这一开源可审计IDE,详解如何合规复用Anthropic免费tier接口(/v1/messages 阅读详情

expirationTime 的计算方式

  • 先看expirationTime相关的源代码,这里是异步的计算方式,它会有一个过期时间
  • 异步任务优先级比较低,可以被打断,防止一直被打断导致不能执行,所以React给它设置了 expirationTime 过期时间
  • 也就是在这个时间之前,都可以打断,但是如果某个时间点发现任务已经过期了,还没有被执行,则强制执行该任务
  • 在 ReactDOM.render 当中,它计算 expirationTime 的地方
    • 在 ReactFiberReconciler.js 中的 updateContainer 函数中,通过 computeExpirationForFiber 方法来计算一个过期时间
      const current = container.current; // 参数2
      const currentTime = requestCurrentTime(); // 参数1 我们可以近似理解为: 当前时间到js加载完成的时间的时间差值即可
      const expirationTime = computeExpirationForFiber(currentTime, current);
      
    • 而 requestCurrentTime 这个函数,来自于 ReactFiberScheduler.js 中
      function requestCurrentTime() {
        // 这里,我把官方注释移除
      
        // 这里表示 已经进入到 渲染阶段 了,在 ReactDOM.render 中这里不会匹配,会跳过
        // 在一次render中,如果我有一个新的任务进来了,要计算 expirationTime 发现现在处于渲染阶段,这时直接返回上次 render 开始的时间,再去计算 expirationTime
        // 好处是 前后两次计算出来的 expirationTime 是一样的,让这个任务提前进行调度
        if (isRendering) {
          // We're already rendering. Return the most recently read time.
          return currentSchedulerTime;
        }
        // Check if there's pending work.
        findHighestPriorityRoot();
        // 刚初始化的时候,这个条件是成立的
        if (
          nextFlushedExpirationTime === NoWork ||
          nextFlushedExpirationTime === Never
        ) {
          // If there's no pending work, or if the pending work is offscreen, we can
          // read the current time without risk of tearing.
          recomputeCurrentRendererTime();
          currentSchedulerTime = currentRendererTime; // 两个常量划等号
          return currentSchedulerTime;
        }
        // 这里,我把官方注释移除
        return currentSchedulerTime;
      }
      
      • findHighestPriorityRoot 方法涉及到从调度队列中找到权限最高的 Root
        • 这个源码比较多,不做扩展
      • recomputeCurrentRendererTime 每一次做计算都是从当前到js加载完成后的时间间隔,再经过一些计算得到的值,
        function recomputeCurrentRendererTime() {
          const currentTimeMs = now() - originalStartTimeMs; // 当前时间 - react buddle加载完成之后初始的时间,也就是从js加载完成到现在的时间间隔
          currentRendererTime = msToExpirationTime(currentTimeMs); // 计算出 currentRendererTime
        }
        
        // ReactFiberExpirationTime.js 这个函数得到一个时间戳
        export function msToExpirationTime(ms: number): ExpirationTime {
          // Always add an offset so that we don't clash with the magic number for NoWork.
          return ((ms / UNIT_SIZE) | 0) + MAGIC_NUMBER_OFFSET; // UNIT_SIZE 是固定的 10, | 0 是取整的意思, MAGIC_NUMBER_OFFSET 是固定的 2
        }
        
    • 关于 expirationTime 的计算函数 computeExpirationForFiber 有一个计算公式
    • 在这个计算时间中,不需要考虑调度,只考虑计算公式,在 ReactFiberExpirationTime.js 中
      function ceiling(num: number, precision: number): number {
        return (((num / precision) | 0) + 1) * precision;
      }
      
      function computeExpirationBucket(
        currentTime,
        expirationInMs,
        bucketSizeMs,
      ): ExpirationTime {
        return (
          MAGIC_NUMBER_OFFSET +
          ceiling(
            currentTime - MAGIC_NUMBER_OFFSET + expirationInMs / UNIT_SIZE,
            bucketSizeMs / UNIT_SIZE,
          )
        );
      }
      
      // 低权限计算
      export function computeAsyncExpiration(
        currentTime: ExpirationTime,
      ): ExpirationTime {
        return computeExpirationBucket(
          currentTime,
          LOW_PRIORITY_EXPIRATION, // 5000
          LOW_PRIORITY_BATCH_SIZE, // 250
        );
      }
      
      // 高权限计算
      export function computeInteractiveExpiration(currentTime: ExpirationTime) {
        return computeExpirationBucket(
          currentTime,
          HIGH_PRIORITY_EXPIRATION, // 500/150 前 DEV, 后 PROD
          HIGH_PRIORITY_BATCH_SIZE, // 100
        );
      }
      
      • 上面两个 export 方法,都是调用 computeExpirationBucket 方法来计算的
      • 两个方法的区别在于 后面第2和第3个参数是不一样的
      • 最终得到的公式是: ((((currentTime - 2 + 5000 / 10) / 25) | 0 ) + 1) * 25
        • 其中 25 = 250 / 10,上述公式中的25,也可能是 10 (100 / 10)
          • 最终计算出来的 expirationTime 是以 bucketSize / UNIT_SIZE 这个单元向上叠加的
          • 两个 不同的 expirationTime 的差距是 单元值的 倍数
          • 对于 LOW_PRIORITY_BATCH_SIZE 是 以 25 为单元向上加的, 若前后差距在25以内,计算出来的差距都是一样的
          • 对于 HIGH_PRIORITY_BATCH_SIZE 是 以 10 为单元向上加的,同上
          • React 这么设定的原因: 在计算 expirationTime 时
          • 在一个操作内多次调用 setState, 即便前后调用差距很小,但从毫秒级别看,还是有差距的
          • 如果没有提供任何一个调整空间,即便上个 setState 和 下一个 setState 之间差距特别小,算出来的 expirationTime 结果不一样
          • 这就意味着,两次的任务优先级不一样, 会导致 React 整体更新执行多次,而导致整个应用的性能下降,这就是 设置 单元值的 用处
          • 在一个差距很小的时间间隔内,算出来的 expirationTime 结果一样,则它们优先级也是一样的,而不需要进行区分
          • 这个非常重要
        • | 0 表示 去余取整
        • 其中 (currentTime - 2 + 5000 / 10) 是一个不会变化的值,设为 x
        • 后面就是 (((x / 25) | 0) + 1) * 25
        • 这个公式的意义在于,新老值之间的差距在25以内,则结果相等
  • 至于 expirationTime 的作用还要结合后期更新的流程来看
  • expirationTime 是一个和业务无关的比较纯粹的计算过程问题,没有任何副作用
Avalonia 超级详细学习指南 什么是 Avalonia?Avalonia 是一个开源的、跨平台的 GUI 框架,允许开发者使用 XAML 和 C# 构建现代化、高性能的桌面应用程序。与其他框架相比,Avalonia 具有强大的跨平台能力和灵活的界面设计。} }()Avalonia 的特点和优势跨平台性:Avalonia 可以在 Windows、Linux、macOS 等多个平台上运行,开发者可以编写一套代码,然后在不同的操作系统上运行相同的应用程序。 阅读详情

相关推荐

电磁阀的符号解读

先数方框数量定“几位”(工作位置数 );数接口数量(P、A、R等 )定“几通”;看箭头、截断符号,结合常态位(弹簧侧/中间位 ),分析通电/断电时的通路切换;字母(P、A、R )、线圈(单/双电控 )、弹簧(复位 )辅助确认功能(如NO/NC对应常态通断 )。不同厂家符号细节(如编码、线圈画法 )有差异,遇到陌生符号,建议结合产品手册、品牌规范核对,就能精准读懂电磁阀的“语言”啦~

创新改变世界! 6908

04.ExpirationTime计算

ExpirationTime计算规则 react主要把到期时间分为两种:异步任务到期时间与交互工作的到期时间。react的到期时间与系统的时间ms不是1:1的关系,低优先级异步任务的两个时间间隔相差不到250ms(相当于25单位的 到期时间)的任务会被设置为同一个到期时间,交互异步任务间隔100ms(相当于10个单位的 到期时间),因此减少了一些不必要的组件渲染,并且保证交互可以及时响应。 ExpirationTime的作用 在react中,为了防止某个update因为优先级的原因一直被打断而不能执行。re

追随大神的脚步 1094

aubo i5 + realsense D435i识别抓取实践二

aubo i5 + realsense D435i识别抓取实践二前言一、手眼标定是什么?二、标定软件安装1.aruco_ros安装2.vision_visp安装3.easy_handeye安装4.realsense驱动安装5.安装realsense ROS软件包三、配置1.launch文件修改2.打印二维码四、手眼标定1.启动launch文件2.标定步骤3.发布tf关系 前言 前面配置好了aubo机械臂的ROS软件包,机械臂可以正常运行后,接下来我们进行机械臂与相机的手眼标定。手眼标定分为eye_on_ha

转角 6376

一文吃透 React Expiration Time

Expiration Time 概念 首先 Expiration Time 到底是什么呢? 根据英文直接翻译可知,到期时间或者过期时间。在React中到期时间概念又如何理解,我们不妨从它的作用入手理解到底是什么概念。 Expiration Time 作用 在 React 中,源码位置是在 准备阶段 updateContainer 的位置 调用 computeExpirationForFiber 计算时间,这里是在准备阶段创建好React的更新对象,为后面的后面 React 调度做准备。它代表的是 任务在未来

开源世界 629

配置思科交换机冗余链路汇聚

本文对交换机端口汇聚配置进行说明

istrangeboy&begin zero的博客 6686

DaVinciCFG - 实战ADC配置与代码生成避坑指南

本文详细介绍了DaVinciCFG工具中ADC模块的配置与代码生成实战指南。针对工程创建、参数配置、代码生成路径设置等关键环节,提供了避免常见陷阱的实用技巧,并重点分析了ARXML文件手动修改注意事项和代码生成失败的解决方案,帮助开发者高效完成汽车电子开发中的ADC配置。

p5l2m9n4o6q的博客 448

Redis(设计与实现):18---数据库之键的生存时间、过期时间(EXPIRE、PEXPIRE、EXPIREAT、PEXPIREAT、PERSIST、TTL、PTTL)

键的生存时间或过期时间介绍 生存时间(Time To Live,TTL):在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键 过期时间(expire time):是一个UNIX时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键 一、设置键生存/过期时间(EXPIRE、PEXPIRE、EXPIREAT、PEXPIREAT) 设置生存时间: EXPIRE &lt...

董哥的黑板报 2307

Android系统去掉长按webview界面弹框中的分享功能

Android 系统去解决长按显示内容,去掉分享功能,不论那个界面,是所有界面都需要满足。如果仅仅去掉系统自带的,那么系统来处理如果客户自定义,部分App自定义的菜单项,不是调用系统的,那么还是需要应用去解决的。之前做过Editext,其实还需要去TextView,最难点的就是WebView中的HTML了 去分享功能了。WebView中涉及到分享功能菜单的界面,/***//***//***//***//***//***//***//***//**

十年饮冰,难凉热血 1020

Zookeeper-连接和会话的过期清理策略(ExpiryQueue)

背景 简单的会话清理策略 数据结构 更新会话过期时间 清理过期会话 优缺点 分桶策略 具体实现 改进 update poll remove 连接和会话 总结 参考 背景 Zookeeper作为一个服务器,需要管理与客户端的连接和会话,如接受连接,网络IO,和过期清理等,此文章就介绍下Zookeeper的过期策略. 注:目前网络上的资料介绍的都是会话的过期策略,在...

pfjia的博客 3686

SAP_MM模块库存概览俄罗斯报表简介

本文介绍了SAP MM模块中"库存概览俄罗斯报表"的功能与应用。该报表主要用于查看物料在不同库存地点和类型的库存情况,并满足俄罗斯当地法规要求。文章解释了"俄罗斯报表"可能指代本地化合规库存报表或客户自定义报表,详细说明了事务代码J3RFLVMOBVEDH的操作步骤,包括公司代码、物料编码、日期范围等查询条件,并解释了报表中各字段含义如期初期末库存数量与价值。最后强调在物料分类账处理完成后使用该报表可获得实际库存价值,为SAP用户提供了实用的库存管理参考。

我小时候很黑的博客 1092

在 SAP 中,寄售业务(Consignment)与管道业务(Pipeline)都属于“物料先到、发票后到”的特殊采购模式,但两者的库存形态、物权转移时点、结算触发条件、系统配置完全不同

SAP中寄售业务与管道业务均属"先货后票"采购模式,但存在本质差异。寄售业务(如手机芯片)采用实物库存管理(标记"K"),物权在领用时转移,通过411K/201K移动类型触发负债;管道业务(如蒸汽)无实物库存,采用261P等移动类型直接消耗并生成应付。系统配置上,寄售需K类信息记录及GR收货,管道需P类信息记录且免GR。两者均通过MRKO汇总结算,但寄售按领用量计费,管道按提取量实时计费。核心区别在于库存形态与物权转移时点。

金牌架构师 558

redis 查看key的有效期_Redis设置Key的过期时间 – EXPIRE命令

redis> SET cache_page "www.google.com"OKredis> EXPIRE cache_page 30 # 设置过期时间为 30 秒(integer) 1redis> TTL cache_page # 查看剩余生存时间(integer) 23redis> EXPIRE cache_page 30000 # 更新过期时间(integ...

weixin_39932455的博客 1万+

【RT-DETR有效改进】计算训练好权重文件对应的FPS、推理每张图片的平均时间(科研必备)

本文给大家带来的改进机制是利用我们训练好的权重文件计算FPS,同时打印每张图片所利用的平均时间,模型大小(以MB为单位),同时支持batch_size功能的选择,对于轻量化模型的读者来说,本文的内容对你一定有帮助,可以清晰帮你展示出模型速度性能的提升以及轻量化的效果(模型大小),对于以提高精度为目的的读者本文也能够帮助大家展示出现阶段的模型速度指标。所以本文的内容是十分有用的机制,对于大家发表论文来说,下面的图片为运行后的效果可以看到,该有的指标均已打印(本文内容为我独家创新,全网无第二份)下面是效果图和文

Snu77的博客 3633

React16源码: React中的不同的expirationTime的源码实现

在React中不仅仅有异步任务,大部分情况下都是同步的任务,所以会有不同 expirationTime 的存在

Wang的专栏 1493

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

React16源码: React中ReactFiberScheduler的expirationTime及nextExpirationTimeToWorkOn的源码实现

expirationTime 作用在渲染之前的,而 nextExpirationTimeToWorkOn 则是作用在渲染时的。让它在下一次执行更新之前来使用 performSyncWork 这种方式来通过同步的方式去渲染任务。这两个值在整个 render 以及 commit 的过程当中,都起着非常重要的一个作用。所以这就是这两个值它的作用, 通过指定它们来指定更新模式以及更新任务的优先级。为什么说 expirationTime 是作用在渲染前的呢?比如说, 在 renderRoot 中。

Wang的专栏 1274

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

React16源码: React中requestCurrentTime和expirationTime的源码实现补充

关于 currentTime,在计算 expirationTime 和其他的一些地方都会用到, 从它的名义上来讲,应等于performance.now() 或者 Date.now() 就是指定的当前时间, 在react整体设计当中,它是有一些特定的用处和一些特殊的设定的

Wang的专栏 1333

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

React16源码: React中更新阶段中不同类型的expirationTime之pendingTime,suspendedTime以及pingedTime的源码实现

现在发现,3种 expirationTime 的处理最终都调用了。下面是 renderRoot 中的一段代码。2.2 关于 suspendedTime。2.1 关于 pendingTime。

Wang的专栏 1014

react源码阅读4 ExpirationTime

react更新中优先级依赖的标识ExpirationTime。阅读React包的源码版本为16.8.6。   这一章节,让我们抛弃掉react代码中的联系,单纯的来看ExpirationTime以及一些计算方式。 ExpirationTime是什么。   ExpirationTime是一个数字,你可以在react-reconciler包下的ReactFiberExpirationTime.js文件中找到它的定义。 export type ExpirationTime = number; Expiratio

tangding12的博客 524

React16源码: React中的updateMemoComponent的源码实现

我们通过React.memo这个方法创建的组件,它的所有props是直接作用于传入的 function component的。,它会把props作为我自己当前这个组件。为什么在这里它不使用。

Wang的专栏 1012

React16源码: React中调度之requestWork的源码实现

在 scheduleWork 中,找到了创建更新的fiber对应的root节点, 然后对它进行了一些操作之后,调用了 `requestWork`,开始请求工作, 在 requestWork 里面它会做哪些东西呢?首先我们要把这个root节点加入到调度队列当中, 然后判断是否是批量更新, 最后再根据 expirationTime 的类型来判断调度的类型

Wang的专栏 1144

React16源码: React中调度之scheduleWork的源码实现

定位到 packages/react-reconciler/src/ReactFiberScheduler.js。拿之前的一个 Fiber Tree 节点来举例。当中,它需要去找到更新对应的。如果符合条件需要重置 stack。如果符合条件就去请求工作调度。这几个方法最终都调用了。

Wang的专栏 1527

React16源码: React中的update和updateQueue的源码实现

在 `ReactDOM.render` 过程中,还需要创建一个 update 对象, `update` 用于记录组件状态的改变的一个对象,它存放于Fiber对象的 `updateQueue` 中,`updateQueue`,它是一个单向链表的结构,一次整体的更新过程当中, 可能在这个queue里会存在多 Update

Wang的专栏 1665

React16源码: React中的updateMode的源码实现

`Mode` 组件是 react提供给我们的原生组件, 一共有两个: `ConcurrentMode` 和 `StrictMode`, 对于这两个 Mode 的更新过程最终调用的都是 `updateMode` 的方法, 它们执行的过程非常的简单,就是通过 `reconcileChildren` 去创建children就可以了

Wang的专栏 1056

React16源码: React中的renderRoot的源码实现

renderRoot 是一个非常复杂的方法, 它调用 workLoop 进行循环单元更新, 并且捕获错误并进行处理,最后,在走完流程之后要进行善后

Wang的专栏 1397

React16源码: React中的schedule调度整体流程

React Fiber Scheduler 是 react16 最核心的一部分,这块在这个包中这个包的核心是 fiber reconciler,也即是 fiber 结构fiber的结构帮助我们把react整个树的应用,更新的流程,能够拆成每一个fibrer对象为单元的一个更新的流程这种单元的形式把更新拆分出来之后,给每个不同的任务提供一个优先级,以及我们在更新的过程当中,可以中断因为我们记录更新到了哪一个单元,中断了之后,可以过一会儿再回过头来,继续从这个单元开始,继续之前没有做完的更新。

Wang的专栏 1604

React源码解读之更新的创建

React的鲜活生命起源于,这个过程会为它的一生储备好很多必需品,我们顺着这个线索,一探婴儿般React应用诞生之初的悦然。更新创建的操作我们总结为以下两种场景。

weixin_59558923的博客 600
上一篇: React16源码: React中的update和updateQueue的源码实现
下一篇: React16源码: React中的不同的expirationTime的源码实现
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值