【问题标题】:Does `console.log` buffer output in node.js?`console.log` 在 node.js 中缓冲输出吗?
【发布时间】:2015-02-16 05:11:46
【问题描述】:

我想知道console.log 是在 node.js 中缓冲输出还是尝试在每次调用时执行 IO?这似乎没有正式记录。

问题源于输出字符串数组的必要性,我认为哪个成语更有效:

array.forEach(function(line){
  console.log(line)
})

console.log(array.join('\n'))

谢谢

【问题讨论】:

  • 很难想象forEach 方法会更快,除非您已经为其他事情这样做了,但核心问题很有趣。 +1
  • 嗯,在第二种方法中,您先将内存分配给可能很大的字符串,然后将其全部发送到console.log,它可能有也可能没有缓冲区,使用更多的内存。在这种情况下,最好的选择是查看源代码
  • @Kroltan,如果您有足够的时间和专业知识,查看源代码是最好的方法。但如果你不这样做呢?
  • 亚历克斯,对不起。 console.js 的来源:查看log 函数,它只是打印值+换行符。底层 C/C++ 库中的默认行为是,除非必要,否则它不会刷新,所以是的,大部分时间它都会缓冲。

标签: javascript node.js


【解决方案1】:

console.log() 的文档可能没有指定它是否缓冲输出,因为它delegates that decision to an underlying stream

Console.prototype.log = function() {
  this._stdout.write(util.format.apply(this, arguments) + '\n');
};

writable.write()它使用文件缓冲的一般可能性:

返回值指示您是否应该立即继续编写。如果数据必须在内部缓冲,那么它将返回false。否则,它将返回true

此返回值仅供参考。你可以继续写,即使它返回false。但是,写入将被缓冲在内存中,因此最好不要过度执行此操作。而是在写入更多数据之前等待drain 事件。

虽然,全局 console 使用 process.stdout 更有可能阻塞,仅在某些情况下缓冲:

process.stderrprocess.stdout 与 Node 中的其他流不同,对它们的写入通常是阻塞的。

  • 它们在引用常规文件或 TTY 文件描述符的情况下被阻塞。
  • 如果他们指的是管道:
    • 它们在 Linux/Unix 中阻塞。
    • 与 Windows 中的其他流一样,它们是非阻塞的。

要查看是否有任何lines 被缓冲,您可以自己将.write() 发送到stdout 并捕获返回值:

var util = require('util');
var buffered = [];

array.forEach(function(line){
  buffered.push(!process.stdout.write(util.format(line) + '\n'));
});

console.log(buffered);

【讨论】:

  • 问题不就是this._stdout 是否真的缓冲了吗?
  • @Bergi 当然,但这不是简单的“是”或“否”。它可以缓冲,但不能保证。
  • Writables 通常可以两者兼而有之,是的,但 stdout 是一个非常具体的实例。它是known to be blocking
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 2012-04-04
相关资源
最近更新 更多