当前位置: 首页 > 面试题库 >

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

佴淮晨
2023-03-14
问题内容

两者之间有什么区别,什么时候可以使用另一种?


问题答案:

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

setImmediate 在这方面很相似,除了它不使用函数队列。它检查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})

输出量

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)。



 类似资料:
  • 问题内容: 我最近遇到了一个令人讨厌的错误,该错误中的代码是通过JavaScript动态加载的。动态加载的具有预先选择的值。在IE6中,我们已经有代码来修复selected ,因为有时的值可能与selected 的属性不同步,如下所示: 但是,此代码无法正常工作。即使正确设置了字段,最终也会选择错误的索引。但是,如果我在正确的时间插入一条语句,则会选择正确的选项。考虑到这可能是某种时序问题,我尝试

  • 问题内容: Node.js版本0.10已于今天发布并引入。该API的变化文档建议做递归时使用它调用。 从MDN所说的来看,它与。 什么时候应该使用?什么时候应该使用? 问题答案: 如果要将函数放在事件队列中已经存在的任何I/O事件回调后面,请使用此函数。用于将函数有效地放在事件队列的开头,以便在当前函数完成后立即执行。 因此,在您尝试使用递归分解长时间运行且受CPU限制的作业的情况下,您现在想使用

  • 本文向大家介绍setTimeout(fn,100);100毫秒是如何权衡的?相关面试题,主要包含被问及setTimeout(fn,100);100毫秒是如何权衡的?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: setTimeout()函数只是将事件插入了任务列表,必须等到当前代码执行完,主线程才会去执行它指定的回调函数,有可能要等很久,所以没有办法保证回调函数一定会在setTimeout

  • fn

    Quickstart  |  Tutorials  |  Docs  |  API  |  Operating  |  Flow  |  UI Welcome Fn is an event-driven, open source, Functions-as-a-Service (FaaS) compute platform that you can run anywhere. Some of it

  • fn (Function) 注册中间件,当任何讯息流经该中间件时执行中间件中的内容,该中间件会接受参数,也可以判断是否阻断后续中间件的执行。 当发生错误,错误将会通过中间件的回调函数,直接发送一个特殊的错误数据包到客户端。 io.on('connection', (socket) => { socket.use((packet, next) => { if (packet.doge =

  • fn (Function) 注册一个中间件,这个函数将对所有流经的socket执行操作,并且还会已接受传参的方式获得流经的socket,并且流经到当前中间件之后,可以可选择的确定是否流经到下一个中间件。 当错误信息经过中间件,回调函数将会发送一个特殊的错误信息给客户端。 io.use((socket, next) => { if (socket.request.headers.cookie)