setTimeout
就像延迟完成后调用该函数一样。每当调用一个函数时,它不会立即执行,而是排队,以便在所有正在执行的和当前排队的事件处理程序首先完成后再执行。setTimeout(,0)本质上是指在当前队列中的所有当前函数执行之后执行。无法保证需要多长时间。
setImmediate 在这方面很相似,除了它不使用函数队列。它检查I / O事件处理程序的队列。如果当前快照中的所有I /
O事件都已处理,它将执行回调。它在最后一个I / O处理程序之后立即将它们排队,有点像process.nextTick。所以它更快。
而且(setTimeout,0)会很慢,因为它将在执行之前至少检查一次计时器。有时它的速度可能是它的两倍。这是一个基准。
var Suite = require('benchmark').Suitevar fs = require('fs')var suite = new Suitesuite.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)。



