非常快的无限循环,不阻塞 I/O

2024-03-30

有没有更快的替代方案window.requestAnimationFrame()对于不阻塞 I/O 的无限循环?

我在循环中所做的事情与动画无关,所以我不在乎下一帧何时准备好,并且我已经读过window.requestAnimationFrame()受到监视器刷新率的限制,或者至少等待直到可以绘制帧。

我也尝试过以下方法:

function myLoop() {
    // stuff in loop
    setTimeout(myLoop, 4);
}

(4是因为这是最小间隔setTimeout较小的值仍默认为 4。)但是,我需要比这更好的分辨率。

还有比这更好的性能吗?

我基本上需要一个非阻塞版本while(true).


有两件事会比这更快地运行setTimeout:

  • process.nextTick https://nodejs.org/api/process.html#process_process_nexttick_callback_args回调(特定于 NodeJS):

    The process.nextTick()方法将回调添加到“下一个刻度队列”。一旦事件循环的当前轮次运行完成,当前在下一个滴答队列中的所有回调将被调用。

    这不是一个简单的别名setTimeout(fn, 0)。它的效率要高得多。它在事件循环的后续滴答中触发任何其他 I/O 事件(包括计时器)之前运行。

  • 承诺结算通知

因此,这些可能是您工具带上的工具,将其中一个或两个与setTimeout达到你想要的平衡。

Details:

您可能知道,给定的 JavaScript 线程在任务队列的基础上运行(规范将其称为作业队列);您可能知道,浏览器中有一个主要的默认 UI 线程,而 NodeJS 运行单个线程。

但实际上,现代实现中至少有两个任务队列:我们都想到的主要一个(其中setTimeout和事件处理程序放置其任务),以及在处理主任务(或“宏任务”)期间放置某些异步操作的“微任务”队列。一旦宏任务完成,这些微任务就会被处理,before主队列中的下一个宏任务 - 即使下一个宏任务在微任务之前排队。

nextTick回调和承诺结算通知都是微任务。因此,调度要么调度异步回调,但该回调将在下一个主要任务之前发生。

我们可以在浏览器中看到setInterval和一个承诺解析链:

let counter = 0;

// setInterval schedules macrotasks
let timer = setInterval(() => {
  $("#ticker").text(++counter);
}, 100);

// Interrupt it
$("#hog").on("click", function() {
  let x = 300000;

  // Queue a single microtask at the start
  Promise.resolve().then(() => console.log(Date.now(), "Begin"));

  // `next` schedules a 300k microtasks (promise settlement
  // notifications), which jump ahead of the next task in the main
  // task queue; then we add one at the end to say we're done
  next().then(() => console.log(Date.now(), "End"));

  function next() {
    if (--x > 0) {
      if (x === 150000) {
        // In the middle; queue one in the middle
        Promise.resolve().then(function() {
          console.log(Date.now(), "Middle");
        });
      }
      return Promise.resolve().then(next);
    } else {
      return 0;
    }
  }
});

$("#stop").on("click", function() {
  clearInterval(timer);
});
<div id="ticker">&nbsp;</div>
<div><input id="stop" type="button" value="Stop"></div>
<div><input id="hog" type="button" value="Hog"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

当您运行该程序并单击Hog按钮,注意计数器显示如何冻结,然后又继续显示。这是因为提前安排了 300,000 个微任务。另请注意我们编写的三个日志消息上的时间戳(它们不会出现在代码片段控制台中,直到宏任务显示它们,但时间戳向我们显示它们的记录时间)。

所以基本上,您可以安排一堆微任务,并定期让这些微任务运行完并运行下一个宏任务。


Note: 我用过setInterval对于代码片段中的浏览器示例,但是setInterval,具体来说,对于使用 NodeJS 的类似实验来说可能不是一个好的选择,因为 NodeJS 的setInterval与浏览器中的有点不同,并且具有一些令人惊讶的计时特征。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非常快的无限循环,不阻塞 I/O 的相关文章

  • 通过纯 JavaScript 获取 div 的第 n 个子元素

    我有一个名为 myDiv 的 div 元素 我怎样才能得到 myDiv 的第n个孩子DOM https en wikipedia org wiki Document Object Model操纵 Markup function reveal
  • HTML 和 标签有什么区别?

    HEAD 标签和 BODY 标签有什么区别 大多数 HTML 书籍仅 简短 提及 and 标签 但它们消失得很快 它们会影响浏览器呈现网页的方式吗 另外 它们会影响 javascript 的运行顺序吗 我的意思是 如果我里面有一个javas
  • 返回上一页

    我正在使用表格来 评价 页面 此表单将数据 发布 到其他地方的 php 脚本 我只是想在处理表单后显示一个链接 这将使用户返回到上一页 我可以在 php 脚本中使用 javascript 来执行此操作吗 GF 您可以使用链接来调用histo
  • jQuery 可以操作插入的元素吗?

    我是 jQuery 的新手 我认为 jQuery 可以操作由代码添加的元素是合理的 但我发现现在还不能 function addVideo click function publisher append div div
  • 如何将“X-Content-Type-Options: nosniff”添加到我的网络服务器的所有响应标头中

    我正在运行一个 apache 网络服务器 我想将 X Content Type Options nosniff 添加到来自我的网络服务器的所有响应标头 我怎样才能做到这一点 是否可以通过更改 apache 配置文件来实现此目的 确保 mod
  • 在自动完成上添加 jQuery 延迟

    我正在尝试为应用程序创建 jQuery 自动完成 search input on keyup function search this val autocomplete div autocomplete get ajax search se
  • 仅在 Chrome 上我收到此错误:Uncaught TypeError: Illegal constructor [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 当我在 Chrome 上加载 jQuery 时 我会收到此错误 Uncaught TypeError Illegal constr
  • 从对象中取出具有无效(NaN、空白等)值的键的最佳方法?

    我有一个供用户填写的简短搜索表单 将有多个搜索查询进入 MongoDB 该表单创建一个名为的变量searchParams可能看起来像这样 var searchParams city Springfield bedrooms 3 bathro
  • 转义 \u200b(零宽度空格)和其他非法 JavaScript 字符

    我有一组 JavaScript 对象 我引导到后端模板 以在页面加载时初始化我的 Backbone js 集合 它看起来像这样 作为 Twig 模板 我遇到的问题是某些文本字段包含 u200b 零宽度空格 这会破坏
  • 如何调试超时等待异步 Angular 任务?无法在角度页面上找到元素

    编辑 请注意 在 ernst zwingli 的帮助下 我找到了问题的根源 因此 如果您遇到相同的错误 他指出的修复之一可能会帮助您 我的问题是量角器本身的一个已知问题 如果您认为这可能是您 我已经扩展了我的步骤 以在我最初的问题之后查明问
  • 修改 Twitter 帖子上可编辑 Div 的内容

    我正在编写一个 chrome 扩展 它可以帮助用户在 Twitter 上输入内容 当在 twitter 上写推文时 twitter 会打开一个可编辑的 div 容器 当用户输入内容时 twitter 大概正在使用某些网络框架 会生成子 di
  • Socket IO 服务器到服务器

    服务器是否可以使用 Socket IO 连接到另一个服务器并被视为客户端 并让它加入房间 接收 io sockets in lobby emit 和更多 第一个服务器也在监听连接 消息 嘿 Brad 下面是我的完整 js 应用程序 供参考
  • JSONP 使用 JQuery 从 HTTPS 协议获取 JSON

    我正在尝试获取从 https 安全站点发送的 JSON 客户端希望不要使用任何服务器端语言 全部都是 Javascript 我读到 当使用 Jquery 中的 ajax 函数时 我必须使用 JSONP 才能从安全站点加载 JSON 我的第一
  • 嵌套 DIV 的类似斑马的 CSS 样式

    我嵌套了 DIV 元素 但我不知道嵌套的级别 我需要每个都有与其父级不同的背景 创建类似斑马的颜色 我只使用两种背景 深色和白色 效果需要类似于在容器中设置奇数和偶数子级的样式 但在我的例子中 子级是嵌套的 我可以使用每个嵌套元素的规则来做
  • 在 Android Chrome 中隐藏 HTML5 音频/视频通知

    我的网络应用程序上有一个 HTML5 音频元素 在某些时候 我使用以下代码以编程方式停止播放 audioElement pause audioElement currentTime 0 播放音频时 我的 Android 设备 使用 Goog
  • for循环中需要声明变量吗?

    有什么区别 for var i 0 i lt 5 i for i 0 i lt 5 i 是否有必要包含 var 关键字 我知道 var 关键字会影响变量范围 但我无法理解是否有必要在 for 循环中包含该关键字 在第二个示例中 您的变量是全
  • 在 React Web 应用程序中使用 createjs-soundjs

    我想用https www npmjs com package createjs soundjs https www npmjs com package createjs soundjs在 React Web 应用程序上播放声音 我正常安装了
  • Vue-Router 抽象父路由

    我正在尝试将当前网站迁移到 vuejs 站点地图必须是 login signup password reset browse search dozens of other routes 由于其中一些路线共享大量 fx 因此我将它们设为父路线
  • 使用ExternalInterface和IE从JavaScript获取Flash中的当前URL

    我正在尝试获取 Flash 播放器当前所在的 URL 不是 swf 文件的 URL 而是浏览器指向的 URL 到目前为止我已经使用过 var st String ExternalInterface call window location
  • 如何为 jQuery 插件设置私有变量?

    我想创建一个简单的插件 它使用元素的文本作为默认值 或者您可以在调用插件时设置此值 但是 如果我不设置该值 并为多个元素调用插件 则默认值会成倍增加 function fn reText function options var setti

随机推荐

  • 链接到外部 css 文件

    我一直在尝试将我在本地计算机中创建的 css 文件链接到我的 html 代码 但它似乎不起作用 我们应该在 html 代码中保存想要链接的 css 文件 或者我们应该如何链接到该文件 作为一个例子 我发布了这个 html 代码
  • 功能证明 (Haskell)

    我没能读懂 RWH 我命令没有人放弃Haskell 函数式编程的技巧 现在我对第 146 页上的这些功能证明很好奇 具体来说 我试图证明 8 5 1sum reverse xs sum xs 我可以做一些归纳证明 但后来我陷入困境 HYP
  • opencv无法保存视频

    我正在尝试使用 opencv 写入方法保存视频 但视频保存为 0 kb 我的代码出了什么问题 import cv2 cap cv2 VideoCapture k1 mp4 assert cap isOpened fgbg cv2 bgseg
  • 使用 CUDA 进行希尔伯特变换

    为了对一维数组进行希尔伯特变换 必须 对数组进行 FFT 将数组的一半加倍 将另一半归零 反 FFT 结果 我正在使用 PyCuLib 进行 FFTing 到目前为止我的代码 def htransforms data N data shap
  • Firebase 实时数据库的分页

    我一直在尝试寻找一种为 Firebase 实时数据库进行分页的方法 我看到很多关于 Cloud Firestore 分页的教程 文章 但没有看到关于实时数据库的分页 下面是我的代码及其按预期工作 谁能指出我添加分页的正确方向 如果可能的话
  • 使用 Gradle 将模块化库发布到 Maven

    假设我使用 Gradle 进行模块化库开发 在我的根项目中我有子项目geometry algorithms visualizer 我想发布每个的 jar 工件 至于现在在我的根build gradle我有以下部分 apply plugin
  • MVC 模型对象、域对象和 DTO 之间有什么区别

    MVC 模型对象 域对象和 DTO 之间有什么区别 我的理解是 MVC 模型对象 对要由相应视图显示的数据进行建模 它可能不会直接映射到域对象 即可能包含来自一个或多个域对象的数据 客户端 可能包含业务逻辑 例如 验证 计算属性等 没有持久
  • 比较()中的空字段该怎么办?

    在Java中 我使用一个类 其中一些字段可以null 例如 class Foo String bar 我想为这个类写一个BarComparator private static class BarComparator implements
  • 如何使用 VBA sendkeys 打印或发送大括号 ( )

    我有以下代码 但不发送大括号 sendkeys a script sh true 但它作为 a script sh 发送 大括号缺失 Try this SendKeys a script sh True 例如 Sub Sample Dim
  • Adobe Flash Builder 能否用于调试和分析 OpenLaszlo SWF10/SWF11 应用程序?

    我读过 Adob e 的Flash Builder 4 0 支持 ActionScript 3 的分析 http help adobe com en US flashbuilder using WS6f97d7caa66ef6eb1e63e
  • 为什么 Hadoop 中正确的缩减数量是 0.95 或 1.75?

    hadoop 文档指出 正确的归约次数似乎是 0 95 或 1 75 乘以 mapred tasktracker reduce tasks maximum 0 95 所有的减少都可以立即启动并开始 地图完成时传输地图输出 用1 75更快 节
  • UML 类图概念、规范、实现

    我目前正在阅读 Martin Fowler 的 UML Distilled 我刚刚介绍了有关类图的部分 他在其中强调了在对类图进行建模之前理清自己的观点的必要性 然而 在实际绘制类图时 我对它的实际外观有点困惑 例如 我理解理论含义会改变关
  • Symfony2 自定义表单字段

    我对 Symfony 很陌生 所以问题可能看起来有点简单 但我需要帮助 我已经生成了新的捆绑包 我添加了一条新路线Me MyBundle Resources config routing yml my homepage pattern de
  • jQuery:append()对象,用delay()删除()它

    这有什么问题吗 body append div class message success Upload successful div message delay 2000 remove 我想将成功消息附加到我的 html 文档中 但只持续
  • 通过反射获取对象

    我正在寻找 C 中的机制 如下所示 Car car1 Car car2 Car car Car SomeMechanism Get car1 car1 和 car2 是字段 所以我想得到一些带有反射的对象 而不是类型 我怎样才能在c 中做到
  • 如何忽略 Web 浏览器中的脚本错误

    当我关闭使用网络浏览器的应用程序时会发生什么 以下网址使用flash播放器 一切正常 此错误在应用程序关闭时显示 我该如何忽略它 我知道为时已晚 但我觉得我对这个问题有一个聪明的答案 使用这个 它对我来说很有效 webBrowser Scr
  • 多重处理:类型错误:“int”对象不可迭代

    我正在使用multiprocessingPython 3 中的模块 但由于某种原因 它不断抛出TypeError int object is not iterable当我运行程序时 这就是我所做的 def main i global url
  • mod_wsgi 无法连接 WSGI 守护进程

    我正在使用 Easy apache 4 mod wsgi 和 Python 3 5 当我在服务器中调用 Django 项目时 出现以下错误 13 Permission denied mod wsgi pid 24223 Unable to
  • 平移多个 Y 轴之一以获取高图

    我是 highchart javascript 的新手 而且我没有样品来展示它 但我见过图表有两个 Y 轴 左轴和右轴 我可以上下拖动一个轴而不影响另一个轴 该图表可能包含一些系列数据 我见过构建的插件 http www highchart
  • 非常快的无限循环,不阻塞 I/O

    有没有更快的替代方案window requestAnimationFrame 对于不阻塞 I O 的无限循环 我在循环中所做的事情与动画无关 所以我不在乎下一帧何时准备好 并且我已经读过window requestAnimationFram