NodeJS - setTimeout(fn,0) 与 setImmediate(fn)

2024-02-09

这两者之间有什么区别,什么时候我会使用其中一种而不是另一种?


设置超时时间就像延迟完成后调用该函数一样。每当调用一个函数时,它不会立即执行,而是排队,以便在所有正在执行和当前排队的事件处理程序首先完成后执行。 setTimeout(,0) 本质上意味着在当前队列中的所有当前函数执行完毕后执行。无法保证需要多长时间。

设置立即在这方面是类似的,只是它不使用函数队列。它检查 I/O 事件处理程序的队列。如果当前快照中的所有 I/O 事件均已处理,则执行回调。它在最后一个 I/O 处理程序之后立即将它们排队,有点像 process.nextTick。所以速度更快。

另外 (setTimeout,0) 会很慢,因为它在执行之前至少检查一次计时器。有时速度可能会慢一倍。这是一个基准。

var Suite = require('benchmark').Suite
var fs = require('fs')

var suite = new Suite

suite.add('deffered.resolve()', function(deferred) {
  deferred.resolve()
}, {defer: true})

suite.add('setImmediate()', function(deferred) {
  setImmediate(function() {
    deferred.resolve()
  })
}, {defer: true})

suite.add('setTimeout(,0)', function(deferred) {
  setTimeout(function() {
    deferred.resolve()
  },0)
}, {defer: true})

suite
.on('cycle', function(event) {
  console.log(String(event.target));
})
.on('complete', function() {
  console.log('Fastest is ' + this.filter('fastest').pluck('name'));
})
.run({async: true})

Output

deffered.resolve() x 993 ops/sec ±0.67% (22 runs sampled)
setImmediate() x 914 ops/sec ±2.48% (57 runs sampled)
setTimeout(,0) x 445 ops/sec ±2.79% (82 runs sampled)

第一个给出了最快的调用的想法。您可以检查一下 setTimeout 被调用的次数是否是其他次数的一半。另请记住 setImmediate 将根据您的文件系统调用进行调整。因此在负载下它的性能会降低。我不认为 setTimeout 可以做得更好。

setTimeout 是在一段时间后调用函数的非侵入式方法。就像在浏览器中一样。它可能不适合服务器端(想想为什么我使用 benchmark.js 而不是 setTimeout)。

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

NodeJS - setTimeout(fn,0) 与 setImmediate(fn) 的相关文章

随机推荐

  • python 绘制填充颜色的饼图

    我正在尝试绘制一个填充颜色的饼形 我尝试以不同的方式做到这一点 这是代码 ball pygame draw circle self screen self pink self pos self r 0 pygame gfxdraw pie
  • Hexdump反向命令

    The hexdump https www man7 org linux man pages man1 hexdump 1 html命令将任何文件转换为十六进制值 但是 如果我有十六进制值并且我想反转该过程 这可能吗 有一个类似的工具叫做x
  • Json <-> 与 GWT 一起使用的 Java 序列化 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Delphi 中的dynamic_cast 相当于什么?

    在Delphi中 相当于C 的什么dynamic cast reinterpret cast and static cast运算符 尤其是在对象上使用时 重新解释 cast 大多数时候 在 Delphi 中 演员表是reinterpret
  • 如何让 Eclipse 显示类的整个 javadoc

    eclipse可以显示整个javadoc吗 即 当我突出显示对象引用时 所有方法 及其描述 例如 如果我做系统 它会向我显示 java lang System System 类包含几个有用的类字段和方法 它 无法实例化 System 类提供
  • git 可以用于非文本文档(例如 word doc 或 xls 等)的版本控制吗

    我最近一直在学习 GIT 版本控制系统 它似乎对于纯文本文档非常有效 因为您可以添加一行 返回并分叉它 修改文档并删除刚刚添加的行 我主要用 Excel 编程并用 Word 编写文档 GIT 可以用来管理这些文件的版本 显然不是文件内部的内
  • Angular 7+ 上的动态导入

    我正在尝试构建包含一些具有动态导入的组件的项目 例如 import Directive Input ElementRef from angular core Directive selector saKnob export class Kn
  • 字寻址和字节寻址之间的区别

    有人可以解释一下有什么区别吗Word and Byte可寻址 它与内存大小等有何关系 A byte is a 记忆单元 https en wikiversity org wiki Memory Unit for storage A 存储芯片
  • 添加到观看与添加到快速观看

    添加到观看和添加到快速观看之间有什么区别吗 添加到监视 将变量添加到监视窗口 以便您可以在单步执行代码时看到其值的变化 QuickWatch 会弹出一个短暂的对话框 显示该值 而不会在任何地方永久添加它 当您关闭该对话框时 您将无法再看到该
  • 如何使用 PAT 和命令行 git 或 sourcetree 克隆 azure dev ops git 存储库?

    好的 我们的组织在 azure devops 存储库中拥有代码 我一直在尝试通过 Mac 上的 git 命令行 Mac 上的 SourceTree 和 Windows 上的 SourceTree 来克隆它 但没有成功 我在 azure gi
  • 在大写字母前插入空格的Pythonic方法

    我有一个文件 我正在通过 python 脚本更改其格式 我在这个文件中有几个驼峰式字符串 我只想在大写字母之前插入一个空格 所以 WordWordWord 变成 Word Word Word 我有限的正则表达式经验对我来说已经停滞了 有人能
  • 如何在内容脚本和插件之间共享代码?

    我正在为 Firefox 4 编写一个扩展 我在名为的文件中有一些代码utils js我想从两个插件中调用它main js并从page mod的内容脚本 是否可以从两者引用同一个utils js 如果是这样 怎么办 编辑 更好的解决方案是允
  • 将表格列压缩至最小可能宽度

    在我的网站上 我有很多 table 其中有一个特定的列 我们希望将其压缩到尽可能小的空间 而不将其文本换行 其他兄弟单元自动共享其余空间 我正在使用以下技巧 它适用于除 IE7 之外的所有浏览器 此时我其实只关心IE7 table widt
  • C#:从 KeyEventArgs 的 KeyData 获取正确的按键

    I am trapping a KeyDown event and I need to be able to check whether the current keys pressed down are Ctrl Shift M 我知道我
  • 如何向 Chart.js 上的折线图添加空数据点?

    我正在尝试使用 Chart js 在折线图中添加空数据点 我有这个 var data labels 1 2 3 4 5 6 7 8 9 10 datasets label Traffic data null null 20 40 null
  • WPF 桌面应用程序、Windows 10 通知 Toast 2016(UWP 社区工具包)

    我正在尝试用我的 Windows 10 Toasts 显示WPF C 桌面应用程序 遗憾的是 非 UWP 或商店应用程序中有关 Windows 10 通知的 API 和一般支持似乎相当有限且混乱 最近 UWP 社区工具包 https git
  • 在inno setup中如何设置unins000.exe的产品名称、产品版本和版权属性[重复]

    这个问题在这里已经有答案了 我已经使用 inno setup 创建了一个安装程序 一切正常 但安装后将生成 unins000 exe 该 exe 没有设置产品名称 产品版本和版权属性 任何人都可以解释一下如何构建安装程序 以便 unins0
  • 在 Swing 中,是否有一个属性可以设置 JList 禁用前景色?

    在 Swing 中 是否有一个属性可以设置 JList 禁用前景色 我正在使用 Netbeans GUI 构建器 并且想向资源属性文件添加一个属性 以便在禁用 JList 时将 JList 中的文本颜色设置为不同的默认颜色 使用 Nimbu
  • document.querySelector() 返回 null

    我正在创造一个聚合物元件 我已经制作了模板 现在正在编写脚本 由于某种原因 document querySelector 为类和 id 选择器返回 null 不确定这是否不适用于聚合物 没有理由它不应该 或者我没有导入某些东西或者还有什么问
  • NodeJS - setTimeout(fn,0) 与 setImmediate(fn)

    这两者之间有什么区别 什么时候我会使用其中一种而不是另一种 设置超时时间就像延迟完成后调用该函数一样 每当调用一个函数时 它不会立即执行 而是排队 以便在所有正在执行和当前排队的事件处理程序首先完成后执行 setTimeout 0 本质上意