Колко бързо може да бъде извикан методът 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 ms. Ако отнеме достатъчно време интервалите да се припокриват един с друг, където един ще бъде добавен към опашката на събития, когато друг вече чака, по-новият интервал се пропуска (или „изпуска“).

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

write не трябва изрично да ограничава производителността, но може да бъде ограничена от цялостната производителност, която Node може да постигне на вашия компютър (засегната от CPU, RAM и т.н.).

Ще трябва да направите бенчмарк и да сравните ефективността на updateLoop с различни количества от playerInfo. Има няколко пакета, които можете да използвате за това, включително ben:

ben(1000, updateLoop, function (ms) {
    console.log(ms, 'milliseconds per iteration');
});
person Jonathan Lonowski    schedule 21.09.2012
comment
Хей, Джонатан, много ти благодаря за съвета! След като прочетох статията на John Resig, почти съм сигурен, че проблемът ми се дължи на отпадането на интервали. Ще използвам setTimeout() вместо setInterval() и ще го тествам с ben. Още веднъж благодаря! :) - person innerfirexy; 21.09.2012