node.js - 为什么 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 行连续的代码(“第一和第二”)比分开的代码行(“第二和第三”)长 3 倍通过 setImmediate() 的不同事件循环?
解决方案
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 控制台实现的。
推荐阅读
- php - 立方体哈希。纯 PHP 实现。多字节块问题(CubeHash160+16/32+160-256)
- sql - 从复合类型中检索数据
- r - 使用 geom_scatterpie 防止在 GADM ggplot 地图上重叠饼图
- java - 尝试调用虚方法 FAB 按钮
- prolog - 调度代码并不能识别所有解决方案。可能不回溯?
- python-3.x - 决策树回归错误-ValueError:输入包含 NaN、无穷大或对于 dtype('float32') 而言太大的值
- swift - SwiftUI 获取 ViewModel 中另一个 ViewModel 的值
- window - 如何在 Visual Studio 扩展中为工具窗口添加图标
- android - 获取从 ActivityResultContracts.OpenMultipleDocuments() 合约返回的结果的文件名
- reactjs - 编辑状态并返回后刷新上一个屏幕