为什么setImmediate()的运行速度比顺序代码快?

时间:2018-08-25 21:01:55

标签: node.js event-loop setimmediate

我正在学习setImmediate()的工作原理,遇到了一个奇怪的问题,我找不到技术解释。

代码非常简单:

setImmediate(function(){
    console.log("third", process.hrtime() );
});

console.log("first", process.hrtime() );
console.log("second", process.hrtime() );

无论我运行这段代码多少次,总体结果总是相同的,即:

顺序代码(在“第一”和“第二”打印之间)的时间似乎比“第二”和“第三”打印之间的时间长3倍。

让我提供3个示例输出来说明这一点:

示例1

C:\>node tick.js
first [ 24684, 930636615 ]
second [ 24684, 933914009 ]
third [ 24684, 935172006 ]

第一到第二花费0.0033秒

秒到秒花费0.0012秒(=快3倍)

示例2

C:\>node tick.js
first [ 24706, 107198319 ]
second [ 24706, 110517238 ]
third [ 24706, 111784622 ]

第一到第二花费0.0034秒

秒到秒花费0.0012秒

示例3

C:\>node tick.js
first [ 24707, 952826072 ]
second [ 24707, 956081565 ]
third [ 24707, 957319084 ]

第一到第二花费0.0032秒

秒到秒花费0.0013秒

是吗?

考虑到setImmediate发生在下一个事件循环中的事实, 有谁知道为什么两个连续的代码行(“第一和第二”)花费的时间比在不同事件循环中分开的代码行(“第二和第三”)花费的时间长三倍? setImmediate()吗?

1 个答案:

答案 0 :(得分:2)

console的通话比其他通话的费用高得多,这污染了测试。

的输出
let time1;
let time2;
let time3;

setImmediate(function(){
  time3 = process.hrtime();

  console.log(time1[1]);
  console.log(time2[1]);
  console.log(time3[1]);
});

time1 = process.hrtime();
time2 = process.hrtime();

  

908101090

     

908184221

     

909359846

的输出
let time1;
let time2;
let time3;

setImmediate(function(){
  time3 = process.hrtime();

  console.log(time1[1]);
  console.log(time2[1]);
  console.log(time3[1]);
});

time1 = process.hrtime();
console.log();
time2 = process.hrtime();
console.log();

  

949882232

     

954583707

     

956190379

因此,这非常特定于Node.js控制台实现。