util: improve util.format performance
By manually copying arguments and breaking the try/catch out, we are able to improve the performance of util.format by 20-100% (depending on the types). PR-URL: https://github.com/nodejs/node/pull/5360 Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
735e0df8e4
commit
8d72b0d291
35
lib/util.js
35
lib/util.js
@ -9,39 +9,48 @@ const isError = internalUtil.isError;
|
|||||||
|
|
||||||
var Debug;
|
var Debug;
|
||||||
|
|
||||||
|
function tryStringify(arg) {
|
||||||
|
try {
|
||||||
|
return JSON.stringify(arg);
|
||||||
|
} catch (_) {
|
||||||
|
return '[Circular]';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const formatRegExp = /%[sdj%]/g;
|
const formatRegExp = /%[sdj%]/g;
|
||||||
exports.format = function(f) {
|
exports.format = function(f) {
|
||||||
if (typeof f !== 'string') {
|
if (typeof f !== 'string') {
|
||||||
var objects = [];
|
const objects = new Array(arguments.length);
|
||||||
for (var index = 0; index < arguments.length; index++) {
|
for (var index = 0; index < arguments.length; index++) {
|
||||||
objects.push(inspect(arguments[index]));
|
objects[index] = inspect(arguments[index]);
|
||||||
}
|
}
|
||||||
return objects.join(' ');
|
return objects.join(' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arguments.length === 1) return f;
|
if (arguments.length === 1) return f;
|
||||||
|
|
||||||
var i = 1;
|
const len = arguments.length;
|
||||||
var args = arguments;
|
const args = new Array(len);
|
||||||
var len = args.length;
|
var i;
|
||||||
var str = String(f).replace(formatRegExp, function(x) {
|
for (i = 0; i < len; i++) {
|
||||||
|
args[i] = arguments[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 1;
|
||||||
|
var str = f.replace(formatRegExp, function(x) {
|
||||||
if (x === '%%') return '%';
|
if (x === '%%') return '%';
|
||||||
if (i >= len) return x;
|
if (i >= len) return x;
|
||||||
switch (x) {
|
switch (x) {
|
||||||
case '%s': return String(args[i++]);
|
case '%s': return String(args[i++]);
|
||||||
case '%d': return Number(args[i++]);
|
case '%d': return Number(args[i++]);
|
||||||
case '%j':
|
case '%j': return tryStringify(args[i++]);
|
||||||
try {
|
|
||||||
return JSON.stringify(args[i++]);
|
|
||||||
} catch (_) {
|
|
||||||
return '[Circular]';
|
|
||||||
}
|
|
||||||
// falls through
|
// falls through
|
||||||
default:
|
default:
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
for (var x = args[i]; i < len; x = args[++i]) {
|
while (i < len) {
|
||||||
|
const x = args[i++];
|
||||||
if (x === null || (typeof x !== 'object' && typeof x !== 'symbol')) {
|
if (x === null || (typeof x !== 'object' && typeof x !== 'symbol')) {
|
||||||
str += ' ' + x;
|
str += ' ' + x;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user