Почему 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 происходит в следующем цикле событий, есть ли у кого-нибудь идея, почему две последовательные строки кода ("первая и вторая") занимают в 3 раза больше строк кода ("вторая и третья"), которые разделены на различные циклы событий через setImmediate()?

1 ответ

Решение

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.

Другие вопросы по тегам