Browse Source

child_process: Avoid extra copy for string stdio

There's no need to create a new Buffer instance if we're just going to
immediately call toString() at the end anyway.  Better to create a
string up front, and setEncoding() on the streams, and do a string
concatenation instead.
v0.11.7-release
isaacs 11 years ago
parent
commit
ee695e935d
  1. 46
      lib/child_process.js

46
lib/child_process.js

@ -611,8 +611,18 @@ exports.execFile = function(file /* args, options, callback */) {
windowsVerbatimArguments: !!options.windowsVerbatimArguments windowsVerbatimArguments: !!options.windowsVerbatimArguments
}); });
var _stdout = []; var encoding;
var _stderr = []; var _stdout;
var _stderr;
if (options.encoding !== 'buffer' && Buffer.isEncoding(options.encoding)) {
encoding = options.encoding;
_stdout = '';
_stderr = '';
} else {
_stdout = [];
_stderr = [];
encoding = null;
}
var stdoutLen = 0; var stdoutLen = 0;
var stderrLen = 0; var stderrLen = 0;
var killed = false; var killed = false;
@ -633,13 +643,14 @@ exports.execFile = function(file /* args, options, callback */) {
if (!callback) return; if (!callback) return;
// merge chunks // merge chunks
var stdout = Buffer.concat(_stdout); var stdout;
var stderr = Buffer.concat(_stderr); var stderr;
if (!encoding) {
if (Buffer.isEncoding(options.encoding)) { stdout = Buffer.concat(_stdout);
// convert to strings stderr = Buffer.concat(_stderr);
stdout = stdout.toString(options.encoding); } else {
stderr = stderr.toString(options.encoding); stdout = _stdout;
stderr = _stderr;
} }
if (ex) { if (ex) {
@ -683,25 +694,38 @@ exports.execFile = function(file /* args, options, callback */) {
} }
child.stdout.addListener('data', function(chunk) { child.stdout.addListener('data', function(chunk) {
_stdout.push(chunk);
stdoutLen += chunk.length; stdoutLen += chunk.length;
if (stdoutLen > options.maxBuffer) { if (stdoutLen > options.maxBuffer) {
ex = new Error('stdout maxBuffer exceeded.'); ex = new Error('stdout maxBuffer exceeded.');
kill(); kill();
} else {
if (!encoding)
_stdout.push(chunk);
else
_stdout += chunk;
} }
}); });
child.stderr.addListener('data', function(chunk) { child.stderr.addListener('data', function(chunk) {
_stderr.push(chunk);
stderrLen += chunk.length; stderrLen += chunk.length;
if (stderrLen > options.maxBuffer) { if (stderrLen > options.maxBuffer) {
ex = new Error('stderr maxBuffer exceeded.'); ex = new Error('stderr maxBuffer exceeded.');
kill(); kill();
} else {
if (!encoding)
_stderr.push(chunk);
else
_stderr += chunk;
} }
}); });
if (encoding) {
child.stderr.setEncoding(encoding);
child.stdout.setEncoding(encoding);
}
child.addListener('close', exithandler); child.addListener('close', exithandler);
child.addListener('error', errorhandler); child.addListener('error', errorhandler);

Loading…
Cancel
Save