From 6531f187d877da403af0bbe5aa9814705e5ace61 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Wed, 27 Jun 2012 19:15:28 +0200 Subject: [PATCH] util: speed up formatting of large arrays/objects Don't .indexOf() into the keys array. V8 is smart but not so smart that it knows how to turn the linear scan into a O(1) lookup. Fixes #3562. --- lib/util.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/util.js b/lib/util.js index 580aa8119..65888920c 100644 --- a/lib/util.js +++ b/lib/util.js @@ -175,6 +175,17 @@ function stylizeNoColor(str, styleType) { } +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it @@ -193,8 +204,12 @@ function formatValue(ctx, value, recurseTimes) { } // Look up the keys of the object. - var visibleKeys = Object.keys(value); - var keys = ctx.showHidden ? Object.getOwnPropertyNames(value) : visibleKeys; + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } // Some type of object without properties can be shortcutted. if (keys.length === 0) { @@ -334,7 +349,7 @@ function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { str = ctx.stylize('[Setter]', 'special'); } } - if (visibleKeys.indexOf(key) < 0) { + if (!visibleKeys.hasOwnProperty(key)) { name = '[' + key + ']'; } if (!str) { -- 2.34.1