2

setImmediate() がどのように機能するかを学んでいますが、技術的な説明が見つからないという奇妙なことに遭遇しました。

コードは非常に単純です。

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

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

このコードを何回実行しても、一般的な結果は常に同じです。

シーケンシャル コードの時間 (「1 回目」と「2 回目」の印刷の間) は、「2 回目」と「3 回目」の印刷の間の時間よりも 3 倍長くかかるようです。

これを説明するために、3 つの出力例を示します。

例 1

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

最初から2番目まで0.0033秒かかります

2 番目から 3 番目にかかる時間は 0.0012 秒(= 3 倍の速さ)

例 2

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

最初から2番目まで0.0034秒かかります

2 番目から 3 番目までに 0.0012 秒かかります

例 3

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

最初から2番目まで0.0032秒かかります

2 番目から 3 番目までに 0.0013 秒かかります

したがって?

setImmediate が次のイベント ループで発生するという事実を考慮すると、2 つの連続するコード行 (「1 番目と 2番目」) が、分離されているコード行 (「2 番目と 3 番目」)よりも3 倍長くかかる理由を知っている人はいますか? setImmediate() を介したさまざまなイベントループ?

4

1 に答える 1

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 コンソールの実装に非常に固有のものです。

于 2018-08-25T23:09:50.160 に答える