Как быстро может быть вызван метод write() доступного для записи потока в node.js?

На моей стороне сервера я использую записываемый поток для записи изменяющихся данных всех клиентов, подключенных к серверу. Вот что я написал:

function updateLoop () {
    var data = {'timeStep': timeStep, 'playerInfo': playerInfo};
    var text = JSON.stringify(data);
    writeStram.write(text + '\n');
    timeStep += 1;
}
...
updateTimer = setInterval(updateLoop, 50);

So the function updateLoop() is called every 50ms.

It works when 'playerInfo' is small (less than 1KB), for example, after the server side running for 20s, there are 20*1000/50 = 400 lines of data in the output file

But when 'playerInfo' became larger, like 6KB or more, after the server side running for 20s, there only 220 lines of data in the output file. The larger playerInfo is, the lesser lines of successfully recorded data in the output file there is.

Мне интересно, есть ли ограничение на скорость вызова метода write()

Большое спасибо за помощь вашим ребятам!


person innerfirexy    schedule 21.09.2012    source источник
comment
Вместо setInterval/setTimeout вы можете рассмотреть возможность добавления обратного вызова, чтобы вы могли написать следующую строку как можно скорее. writeStream.write(text + '\n', updateLoop);   -  person Patrick McElhaney    schedule 25.09.2012


Ответы (1)


Скорее всего, проблема связана не конкретно с write, а с setInterval и как работают таймеры в JavaScript.

С большими данными updateLoop, вероятно, займет больше времени для завершения выполнения, чем установленная задержка в 50 мс. Если требуется достаточно много времени, чтобы интервалы перекрывали друг друга, когда один из них будет добавлен в очередь событий, когда другой уже ожидает, более новый интервал пропускается (или «отбрасывается»).

Как быстро может быть вызван метод write() доступного для записи потока в node.js?

write не должен явно снижать производительность, но он может быть ограничен общей производительностью, которую узел может достичь на вашем компьютере (зависит от ЦП, ОЗУ и т. д.).

Вам нужно будет протестировать и сравнить производительность updateLoop с различным количеством playerInfo. Для этого можно использовать несколько пакетов, в том числе ben:

ben(1000, updateLoop, function (ms) {
    console.log(ms, 'milliseconds per iteration');
});
person Jonathan Lonowski    schedule 21.09.2012
comment
Привет, Джонатан, большое спасибо за совет! Прочитав статью Джона Резига, я почти уверен, что моя проблема связана с выпадением интервалов. Я собираюсь использовать setTimeout() вместо setInterval() и протестировать его с Беном. Еще раз спасибо! :) - person innerfirexy; 21.09.2012