栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/448602.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号