我想知道console.log
是否在node.js中缓冲输出或尝试在每次调用时执行IO?这似乎没有正式记录。
问题产生于输出字符串数组的必要性,我认为哪种成语更有效:
array.forEach(function(line){
console.log(line)
})
或
console.log(array.join('\n'))
由于
答案 0 :(得分:6)
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.stderr
和process.stdout
与Node中的其他流不同,因为对它们的写入通常是阻塞的。
- 如果它们引用常规文件或TTY文件描述符,它们就会阻塞。
- 在他们提到管道的情况下:
- 他们在Linux / Unix中阻塞。
- 它们与Windows中的其他流一样无阻塞。
要查看是否缓存了任何line
,您可以.write()
将它们stdout
转移到var util = require('util');
var buffered = [];
array.forEach(function(line){
buffered.push(!process.stdout.write(util.format(line) + '\n'));
});
console.log(buffered);
并获取返回值:
{{1}}