最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Does `console.log` buffer output in node.js? - Stack Overflow

programmeradmin2浏览0评论

I wonder if console.log buffers output in node.js or tries to perform IO on each invocation? This doesn't seem to be officially documented.

The question arose from the necessity to output an array of strings and I think which idiom is more efficient:

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

or

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

Thanks

I wonder if console.log buffers output in node.js or tries to perform IO on each invocation? This doesn't seem to be officially documented.

The question arose from the necessity to output an array of strings and I think which idiom is more efficient:

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

or

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

Thanks

Share Improve this question asked Dec 17, 2014 at 15:37 Alex YurshaAlex Yursha 3,4283 gold badges28 silver badges25 bronze badges 5
  • It's hard to imagine the forEach method would be faster unless you already do it for something else, but the core question is interesting. +1 – Alexander O'Mara Commented Dec 17, 2014 at 15:44
  • Well, in the second approach you allocate memory to the possibly big string up front, then send it all to console.log, which may or not have a buffer, using even more memory. In this case, the best option is to look at the source code – Kroltan Commented Dec 17, 2014 at 15:54
  • @Kroltan, looking at the sources is the best approach if you have enough time and expertise. But what if you don't? – Alex Yursha Commented Dec 17, 2014 at 16:02
  • Alex, sorry. The source for console.js: Looking at the log function, it just prints the value + a newline. And the default behavior for that in the underlying C/C++ library is that it doesn't flush except when necessary, so yes, most of the time it buffers. – Kroltan Commented Dec 17, 2014 at 16:06
  • 2 Very much related, if not duplicate: is node.js' console.log asynchronous? (and maybe Difference between “process.stdout.write” and “console.log” in node.js?) – Bergi Commented Dec 17, 2014 at 16:06
Add a ment  | 

1 Answer 1

Reset to default 7

The documentation for console.log() probably doesn't specify whether it buffers output because it delegates that decision to an underlying stream:

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

The writable.write() it's using documents the general possibility of buffering:

The return value indicates if you should continue writing right now. If the data had to be buffered internally, then it will return false. Otherwise, it will return true.

This return value is strictly advisory. You MAY continue to write, even if it returns false. However, writes will be buffered in memory, so it is best not to do this excessively. Instead, wait for the drain event before writing more data.

Though, the global console uses process.stdout that's more likely to block, buffering only under certain circumstances:

process.stderr and process.stdout are unlike other streams in Node in that writes to them are usually blocking.

  • They are blocking in the case that they refer to regular files or TTY file descriptors.
  • In the case they refer to pipes:
    • They are blocking in Linux/Unix.
    • They are non-blocking like other streams in Windows.

To see whether any lines are buffered, you could .write() them to stdout yourself and capture the return value:

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

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

console.log(buffered);
发布评论

评论列表(0)

  1. 暂无评论