diff --git a/benchmark/arrays/push-vs-index-attribution.js b/benchmark/arrays/push-vs-index-attribution.js new file mode 100644 index 00000000000000..222ed995420d4a --- /dev/null +++ b/benchmark/arrays/push-vs-index-attribution.js @@ -0,0 +1,51 @@ +'use strict'; + +const common = require('../common.js'); + +const obj = { + array_push______: function(n){ + var arr = []; + for(let i=0; i<=n; i++) arr.push(i); + + return arr; + }, + + array_unshift___: function(n){ + var arr = []; + for(let i=n; i--;) arr.unshift(i); + + return arr; + }, + + array_index_incr: function(n){ + var arr = new Array(n); + for(let i=0; i<=n; i++) arr[i] = i; + + return arr; + }, + + array_index_decr: function(n){ + var arr = new Array(n); + for(let i=n; i--;) arr[i] = i; + + return arr; + }, +}; + +const bench = common.createBenchmark(main, { + type: Object.keys(obj), + n: [1000], +}); + + +function main(conf) { + 'use strict'; + const + func = obj[conf.type], + n = +conf.n; + + bench.start(); + func(n); + // console.log(String(func)); + bench.end(n); +} \ No newline at end of file diff --git a/lib/util.js b/lib/util.js index 42661608ddf7f5..8859829e8d04e1 100644 --- a/lib/util.js +++ b/lib/util.js @@ -18,55 +18,35 @@ function tryStringify(arg) { } exports.format = function(f) { + const args = arguments; + const len = args.length; + if (typeof f !== 'string') { - const objects = new Array(arguments.length); - for (var index = 0; index < arguments.length; index++) { - objects[index] = inspect(arguments[index]); + const objects = new Array(len); + for (let i = len; i--;) { + objects[i] = inspect(args[i]); } return objects.join(' '); } - var argLen = arguments.length; - - if (argLen === 1) return f; - - var str = ''; - var a = 1; - var lastPos = 0; - for (var i = 0; i < f.length;) { - if (f.charCodeAt(i) === 37/*'%'*/ && i + 1 < f.length) { - switch (f.charCodeAt(i + 1)) { - case 100: // 'd' - if (a >= argLen) - break; - if (lastPos < i) - str += f.slice(lastPos, i); - str += Number(arguments[a++]); - lastPos = i = i + 2; - continue; - case 106: // 'j' - if (a >= argLen) - break; - if (lastPos < i) - str += f.slice(lastPos, i); - str += tryStringify(arguments[a++]); - lastPos = i = i + 2; - continue; - case 115: // 's' - if (a >= argLen) - break; - if (lastPos < i) - str += f.slice(lastPos, i); - str += String(arguments[a++]); - lastPos = i = i + 2; - continue; - case 37: // '%' - if (lastPos < i) - str += f.slice(lastPos, i); - str += '%'; - lastPos = i = i + 2; - continue; - } + if (len === 1) return f; + + var i = 1; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + // falls through + default: + return x; } ++i; }