设置超时时间就像延迟完成后调用该函数一样。每当调用一个函数时,它不会立即执行,而是排队,以便在所有正在执行和当前排队的事件处理程序首先完成后执行。 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)。