From a74addc2da0539340e38574cd0894a58e4de3e10 Mon Sep 17 00:00:00 2001 From: surya panikkal Date: Thu, 9 Jun 2016 22:10:10 -0400 Subject: [PATCH 1/4] 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. --- .../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..a7d79d49d90ea7 --- /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: ['util._extend', 'Object.assign', + 'util._extend', 'Object.assign'], + n: [10e4] +}); + +function main(params) { + let fn; + const n = params.n | 0; + let v8command; + + if (params.type == 'util._extend') { + fn = util._extend; + v8command = '%OptimizeFunctionOnNextCall(util._extend)'; + + } else if (params.type == 'Object.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 (let i = 0; i < params.type.length * 10; i += 1) + fn({}, process.env); + + v8.setFlagsFromString('--allow_natives_syntax'); + eval(v8command); + + bench.start(); + for (let i = 0; i < n; i += 1) + fn({}, process.env); + bench.end(n); +} From 100a8be9906558ef921151813199c5cb94bd464d Mon Sep 17 00:00:00 2001 From: surya panikkal Date: Fri, 10 Jun 2016 20:32:20 -0400 Subject: [PATCH 2/4] benchmark: review comments --- .../misc/util-extend-vs-object-assign.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/benchmark/misc/util-extend-vs-object-assign.js b/benchmark/misc/util-extend-vs-object-assign.js index a7d79d49d90ea7..b74ffefb4d6f48 100644 --- a/benchmark/misc/util-extend-vs-object-assign.js +++ b/benchmark/misc/util-extend-vs-object-assign.js @@ -5,21 +5,19 @@ const util = require('util'); const v8 = require('v8'); const bench = common.createBenchmark(main, { - type: ['util._extend', 'Object.assign', - 'util._extend', 'Object.assign'], + type: ['extend', 'assign'], n: [10e4] }); -function main(params) { +function main(conf) { let fn; - const n = params.n | 0; + const n = conf.n | 0; let v8command; - if (params.type == 'util._extend') { + if (conf.type === 'extend') { fn = util._extend; v8command = '%OptimizeFunctionOnNextCall(util._extend)'; - - } else if (params.type == 'Object.assign') { + } else if (conf.type === 'assign') { fn = Object.assign; //Object.assign is built-in, cannot be optimized v8command = ''; @@ -27,14 +25,16 @@ function main(params) { // Force-optimize the method to test so that the benchmark doesn't // get disrupted by the optimizer kicking in halfway through. - for (let i = 0; i < params.type.length * 10; i += 1) + for (var i = 0; i < conf.type.length * 10; i += 1) fn({}, process.env); v8.setFlagsFromString('--allow_natives_syntax'); eval(v8command); + var obj = {}; + bench.start(); - for (let i = 0; i < n; i += 1) - fn({}, process.env); + for (var j = 0; j < n; j += 1) + fn(obj, process.env); bench.end(n); } From a3daa3b94757a9fa14a581600251465b532f5fd4 Mon Sep 17 00:00:00 2001 From: surya panikkal Date: Fri, 10 Jun 2016 21:45:01 -0400 Subject: [PATCH 3/4] benchmark: use proxy object as target --- benchmark/misc/util-extend-vs-object-assign.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/misc/util-extend-vs-object-assign.js b/benchmark/misc/util-extend-vs-object-assign.js index b74ffefb4d6f48..1b796fefabd3cf 100644 --- a/benchmark/misc/util-extend-vs-object-assign.js +++ b/benchmark/misc/util-extend-vs-object-assign.js @@ -31,7 +31,7 @@ function main(conf) { v8.setFlagsFromString('--allow_natives_syntax'); eval(v8command); - var obj = {}; + var obj = new Proxy({}, { set: function(a, b, c) { return true; } }); bench.start(); for (var j = 0; j < n; j += 1) From 0e9260fda1d8071f672f510d444fed6539677274 Mon Sep 17 00:00:00 2001 From: surya panikkal Date: Mon, 20 Jun 2016 18:37:22 -0400 Subject: [PATCH 4/4] benchmark: use proxy object as target fixed spacing nit. --- benchmark/misc/util-extend-vs-object-assign.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/misc/util-extend-vs-object-assign.js b/benchmark/misc/util-extend-vs-object-assign.js index 1b796fefabd3cf..caea42ce914cf5 100644 --- a/benchmark/misc/util-extend-vs-object-assign.js +++ b/benchmark/misc/util-extend-vs-object-assign.js @@ -19,7 +19,7 @@ function main(conf) { v8command = '%OptimizeFunctionOnNextCall(util._extend)'; } else if (conf.type === 'assign') { fn = Object.assign; - //Object.assign is built-in, cannot be optimized + // Object.assign is built-in, cannot be optimized v8command = ''; }