NodeJS - setTimeout(fn,0)vs setImmediate(fn) [英] NodeJS - setTimeout(fn,0) vs setImmediate(fn)

查看:393
本文介绍了NodeJS - setTimeout(fn,0)vs setImmediate(fn)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这两者之间有什么区别,我何时会使用另一个?

What is the difference between those two, and when will I use one over the other?

推荐答案

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

setTimeout is simply like calling the function after delay has finished. Whenever a function is called it is not executed immediately, but queued so that it is executed after all the executing and currently queued eventhandlers finish first. setTimeout(,0) essentially means execute after all current functions in the present queue get executed. No guarantees can be made about how long it could take.

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

setImmediate is similar in this regard except that it doesn't use queue of functions. It checks queue of I/O eventhandlers. If all I/O events in the current snapshot are processed, it executes the callback. It queues them immedieately after the last I/O handler somewhat like process.nextTick. So it is faster.

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

Also (setTimeout,0) will be slow because it will check the timer at least once before executing. At times it can be twice as slow. Here is a benchmark.

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不会做得更好。

First one gives idea of fastest possible calls. You can check yourself if setTimeout gets called half as many times as other. Also remember setImmediate will adjust to your filesystem calls. So under load it will perform less. I don't think setTimeout can do better.

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

setTimeout is un-intrusive way of calling functions after some time. Its just like its in the browser. It may not be suited for server-side (think why I used benchmark.js not setTimeout).

这篇关于NodeJS - setTimeout(fn,0)vs setImmediate(fn)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆