【问题标题】:How fast can the method write() of writable stream in node.js be called?node.js中可写流的write()方法能调用多快?
【发布时间】:2012-09-13 10:32:25
【问题描述】:

在我的服务器端,我使用可写流来记录连接到服务器的所有客户端的变化数据。这是我写的:

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

所以函数 updateLoop() 每 50ms 被调用一次。

'playerInfo' 较小(小于 1KB)时有效,例如服务器端运行 20s 后,输出文件中有 20*1000/50 = 400 行数据

但是当'playerInfo'变大,比如6KB或更多,在服务器端运行20s后,输出文件中只有220行数据。 playerInfo 越大,输出文件中成功记录的数据行数越少。

我想知道write()方法的调用率是否有限制

非常感谢你们的帮助!

【问题讨论】:

  • 您可以考虑添加一个回调,而不是 setInterval / setTimeout,以便您可以尽快编写下一行。 writeStream.write(text + '\n', updateLoop);

标签: node.js fs


【解决方案1】:

问题可能不在于 write,而在于 JavaScript 中的 setIntervalhow timers work

对于较大的数据,updateLoop 完成执行所需的时间可能比设置的 50 毫秒延迟要长。如果间隔需要足够长的时间相互重叠,其中一个将被添加到事件队列中,而另一个已经在等待,则新的间隔将被跳过(或“丢弃”)。

node.js中可写流的write()方法调用速度有多快?

write 不应显式限制性能,但它可能会受到 Node 可以在您的计算机上实现的整体性能的限制(受 CPU、RAM 等影响)。

您必须对updateLoop 与不同数量的playerInfo 的性能进行基准测试和比较。您可以使用几个packages,包括ben

ben(1000, updateLoop, function (ms) {
    console.log(ms, 'milliseconds per iteration');
});

【讨论】:

  • 嗨乔纳森,非常感谢您的建议!在阅读了 John Resig 的文章后,我几乎可以肯定我的问题是由于间隔下降造成的。我将使用 setTimeout() 而不是 setInterval() 并用 ben 测试它。再次,谢谢! :)
猜你喜欢
  • 2020-08-08
  • 2016-01-06
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
相关资源
最近更新 更多