2015-02-17 4 views
16

Я хотел бы отслеживать, сколько времени проходит каждый цикл цикла в node.js. Однако я не уверен в лучшем способе измерения этого. Лучший способ я мог придумать выглядит следующим образом:Как обнаружить и измерить блокировку цикла событий в node.js?

var interval = 500; 
var interval = setInterval(function() { 
    var last = Date.now();   
    setImmediate(function() { 
     var delta = Date.now() - last; 
     if (delta > blockDelta) { 
      report("node.eventloop_blocked", delta); 
     } 
    }); 
}, interval); 

Я в принципе вывести время выполнения цикла событий, глядя на задержке setInterval. Я видел такой же подход в модуле узла blocked, но он чувствует себя неточным и тяжелым. Есть ли лучший способ получить эту информацию?

Обновление: Изменено код для использования setImmediate как сделано hapi.js.

+0

[Люди, работающие в hapi.js, делают это аналогичным образом] (https://github.com/hapijs/good/blob/ecd705719777af5810dc224001940205cfebd2eb/lib/process.js#L14-L21), и они контролируют это значение постоянно, поэтому похоже, что это будет ваша самая безопасная ставка. –

+0

Спасибо за указатель. Их использование os 'setImmediate' еще лучше. –

ответ

7

«Есть ли лучший способ получить эту информацию?» я не лучший способ проверки eventloop чем проверка время задержки SetImmediate, но вы можете получить более высокую точность с помощью таймера высокого разрешения узла вместо Date.now()

var interval = 500; 
var interval = setInterval(function() { 
    var last = process.hrtime();   // replace Date.now()   
    setImmediate(function() { 
     var delta = process.hrtime(last); // with process.hrtime() 
     if (delta > blockDelta) { 
      report("node.eventloop_blocked", delta); 
     } 
    }); 
}, interval); 

ПРИМЕЧАНИЕ: дельта будет кортежем массив [секунды, наносекунды].

Для получения более подробной информации о process.hrtime(): https://nodejs.org/api/all.html#all_process_hrtime

"Основное применение для измерения производительности между интервалами."

0

Код

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

var time = process.hrtime(); 
process.nextTick(function() { 
    var diff = process.hrtime(time); 


    console.log('benchmark took %d nanoseconds', diff[0] * 1e9 + diff[1]); 
    // benchmark took 1000000527 nanoseconds 
}); 

EDIT: добавлено объяснение,

process.hrtime ([время])

Возвращает текущий высокого разрешения в режиме реального времени в [секундах, наносекунд] кортежей Array. time является необязательным параметром, который должен быть результатом предыдущего вызова process.hrtime() (и, следовательно, реального времени в массиве [секунд, наносекунд], содержащем предыдущее время) для разницы с текущим временем. Эти времена относятся к произвольному времени в прошлом и не относятся к времени суток и, следовательно, не подвержены часовому дрейфу. Основное использование - измерение производительности между интервалами.

process.nextTick (обратный вызов [, аргумент] [, ...])

После того, как текущий ход событий цикла выполняется до завершения, вызовите функцию обратного вызова.

Это не простой псевдоним setTimeout (fn, 0), он намного эффективнее. Он запускается перед любыми дополнительными событиями ввода-вывода (включая таймеры) в последующих тиках цикла событий.

Смежные вопросы