【发布时间】:2019-01-31 22:08:22
【问题描述】:
我正在学习 setImmediate() 的工作原理,遇到了一个我无法找到技术解释的奇怪现象。
代码真的很简单:
setImmediate(function(){
console.log("third", process.hrtime() );
});
console.log("first", process.hrtime() );
console.log("second", process.hrtime() );
这段代码不管我运行多少次,总的结果都是一样的,就是:
顺序代码的时间(“第一次”和“第二次”打印之间)似乎比“第二次”和“第三次”打印之间的时间长 3 倍。 p>
让我提供 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 个连续的代码行(“第一和第二”)花费 3 倍比通过不同事件循环分隔的代码行(“第二和第三”)的 setImmediate() ?
【问题讨论】:
-
我猜
setImmediate正在排队对该函数的调用,并且它的执行是在后台进行的,这会影响时间。 -
我怀疑函数调用有一些 V8 优化。如果我删除
setImmediate并只运行三个console.log语句,则第一个和第二个之间的时间比第二个和第三个之间的时间大得多。
标签: node.js event-loop setimmediate