为什么 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 发生在下一个事件循环中的事实, 有没有人知道为什么 2 行连续的代码("第一行和第二行"(比通过 setImmediate(( 在不同的事件循环上分隔的代码行("第二行和第三行"(长3 倍

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 控制台实现非常具体。

相关内容

最新更新