Странная операция тестирования результата в секунду - PullRequest
0 голосов
/ 21 ноября 2018

Я работаю на узле 8.11 этот тестовый скрипт:

let end = false;

let i = 0;
setInterval(() => { i++; }).unref();


let k = 0;
async function loop() {
  k++
  if (end === false)
    setImmediate(loop);
}

console.time('test');
loop()
  .then(() => {
    setTimeout(() => {
      end = true;
      console.log('interval', i);
      console.log('recursion', k);
      console.timeEnd('test');
    }, 1000);
  })

И вывод:

interval 997
recursion 824687
test: 1001.831ms

Но, если я прокомментирую эти две строки:

  // if (end === false)
  //  setImmediate(loop);

Результаты:

interval 537
recursion 1
test: 1003.882ms

Я усердно изучал фазы nodejs , но я не понимаю, почему setImmediate должен влиять на результатыфункция интервала.

У вас есть объяснения?

Спасибо

1 Ответ

0 голосов
/ 21 февраля 2019

Это потому, что таймеры на nodejs не являются точными в том смысле, что они являются просто событиями в цикле событий, и поэтому они не могут точно знать, когда они будут запущены, поэтому setTimeout говорит, что он будет выполнен по крайней мере послевремя, которое вы указали.

Заданный интервал ожидания не может рассчитывать на выполнение после этого точного количества миллисекунд.Это связано с тем, что другой исполняемый код, который блокирует или удерживает цикл событий, отодвигает выполнение тайм-аута назад.Единственная гарантия состоит в том, что время ожидания не будет выполнено раньше, чем объявленный интервал времени ожидания.

Когда вы устанавливаете setInmediate, вы заполняете цикл событий множеством промежуточных событий, поэтому вы нажимаететайм-ауты возвращаются в очередь.

Имейте в виду, что циклы цикла событий не имеют одинаковой (точной) длительности во времени, поэтому даже если вы считаете, что setInmediate не должен влиять на таймеры, вы расширяете событиепродолжительность циклов во времени.

Интересные статьи:

https://nodejs.org/en/docs/guides/timers-in-node/

https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c

Редактировать: как вы указали, в вашем случае этонапротив, есть больше итераций при использовании setInmediate.В этом случае это может быть связано с динамической скоростью цикла обработки событий в зависимости от загрузки программы.

...