节点js,为什么setTimeout用50ms比setTimeout 0快

时间:2017-01-15 22:05:43

标签: javascript node.js performance

我现在是Node.js开发人员一年了。昨晚我以为我会在express和http模块之间做一个基准测试,基本上它是一个简单的promise,返回一个字符串并传递给响应,现在我看到http速度相当快,但我遇到了另一个问题,如果我在ab测试中将setTimeout设置为50毫秒,并发度为500和100000个请求,则响应时间比setTimeout 0或process.nextTick快两倍。

现在我知道setTimeout将它带到下一个循环,但在队列结束时,nextTick将它放在下一个循环中,但我真的不明白为什么{{1} 50ms比setTimeout 0快。 即使没有setTimeout,ab测试也比setTimeout 50ms慢很多。

我怀疑是apache ab测试的东西,或者我错过了节点的东西?

setTimeout
http.createServer((req,res)=>{
  setTimeout(()=>{
    check().then(data=>{
      res.write(data);
      res.end();
    })
  },0)

}).listen(3000);

let check = () =>{
  return Promise.try(()=>{
    return 'done with Async'
  })
};

1 个答案:

答案 0 :(得分:1)

使用setTimeout(0)时,您正在该进程上添加一个额外的作业,这可能需要花费一些时间。但是,使用setTimeout(50)可以使请求在队列中准备就绪,并且在50ms之后,它们将全部被发送出去,从而浪费掉额外的时间间隔。例如,考虑一个请求需要花费10毫秒才能发送,而获得响应则需要10毫秒。通过使用setTimeout(50),发送500个请求将花费5000ms,再加上50ms的超时时间和10ms的响应时间,将花费5060ms。现在,如果我们使用setTimeout(0),则将有10ms的时间发送请求和10ms的响应时间。因此,对于500个请求,它将花费10000ms。