From 35c70b5668cac752b87265445573bf383371a622 Mon Sep 17 00:00:00 2001 From: surya panikkal Date: Thu, 9 Jun 2016 22:10:10 -0400 Subject: [PATCH] benchmark: `util._extend` vs `object.assign` To copy the values of all enumerable own properties from- a source object to a target object, node still use- `util._extend`, though newer standard `Object.assign` is available. This is because `util._extend` is found to be faster than `Object.assign`. This benchmark test is to keep track of how performance compare. PR-URL: https://github.com/nodejs/node/pull/7255 Reviewed-By: James M Snell Reviewed-By: Brian White --- .../misc/util-extend-vs-object-assign.js | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 benchmark/misc/util-extend-vs-object-assign.js diff --git a/benchmark/misc/util-extend-vs-object-assign.js b/benchmark/misc/util-extend-vs-object-assign.js new file mode 100644 index 00000000000000..caea42ce914cf5 --- /dev/null +++ b/benchmark/misc/util-extend-vs-object-assign.js @@ -0,0 +1,40 @@ +'use strict'; + +const common = require('../common.js'); +const util = require('util'); +const v8 = require('v8'); + +const bench = common.createBenchmark(main, { + type: ['extend', 'assign'], + n: [10e4] +}); + +function main(conf) { + let fn; + const n = conf.n | 0; + let v8command; + + if (conf.type === 'extend') { + fn = util._extend; + v8command = '%OptimizeFunctionOnNextCall(util._extend)'; + } else if (conf.type === 'assign') { + fn = Object.assign; + // Object.assign is built-in, cannot be optimized + v8command = ''; + } + + // Force-optimize the method to test so that the benchmark doesn't + // get disrupted by the optimizer kicking in halfway through. + for (var i = 0; i < conf.type.length * 10; i += 1) + fn({}, process.env); + + v8.setFlagsFromString('--allow_natives_syntax'); + eval(v8command); + + var obj = new Proxy({}, { set: function(a, b, c) { return true; } }); + + bench.start(); + for (var j = 0; j < n; j += 1) + fn(obj, process.env); + bench.end(n); +}