From 7dc1a87a7b2ac8be34aa1e74643766cdc90c82d4 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Fri, 15 Apr 2016 09:25:58 -0700 Subject: benchmarks: add microbenchmarks for new ES6 features Adds new microbenchmarks for destructuring, rest params and default params. PR-URL: https://github.com/nodejs/node/pull/6222 Reviewed-By: Brian White --- benchmark/es/defaultparams-bench.js | 58 +++++++++++++++++++++++++ benchmark/es/destructuring-bench.js | 50 ++++++++++++++++++++++ benchmark/es/restparams-bench.js | 85 +++++++++++++++++++++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 benchmark/es/defaultparams-bench.js create mode 100644 benchmark/es/destructuring-bench.js create mode 100644 benchmark/es/restparams-bench.js (limited to 'benchmark/es') diff --git a/benchmark/es/defaultparams-bench.js b/benchmark/es/defaultparams-bench.js new file mode 100644 index 0000000000..1b962cfb39 --- /dev/null +++ b/benchmark/es/defaultparams-bench.js @@ -0,0 +1,58 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + method: ['withoutdefaults', 'withdefaults'], + millions: [100] +}); + +function oldStyleDefaults(x, y) { + x = x || 1; + y = y || 2; + assert.strictEqual(x, 1); + assert.strictEqual(y, 2); +} + +function defaultParams(x = 1, y = 2) { + assert.strictEqual(x, 1); + assert.strictEqual(y, 2); +} + +function runOldStyleDefaults(n) { + + common.v8ForceOptimization(oldStyleDefaults); + + var i = 0; + bench.start(); + for (; i < n; i++) + oldStyleDefaults(); + bench.end(n / 1e6); +} + +function runDefaultParams(n) { + + common.v8ForceOptimization(defaultParams); + + var i = 0; + bench.start(); + for (; i < n; i++) + defaultParams(); + bench.end(n / 1e6); +} + +function main(conf) { + const n = +conf.millions * 1e6; + + switch (conf.method) { + case 'withoutdefaults': + runOldStyleDefaults(n); + break; + case 'withdefaults': + runDefaultParams(n); + break; + default: + throw new Error('Unexpected method'); + } +} diff --git a/benchmark/es/destructuring-bench.js b/benchmark/es/destructuring-bench.js new file mode 100644 index 0000000000..0e9b5e93f3 --- /dev/null +++ b/benchmark/es/destructuring-bench.js @@ -0,0 +1,50 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + method: ['swap', 'destructure'], + millions: [100] +}); + +function runSwapManual(n) { + var i = 0, x, y, r; + bench.start(); + for (; i < n; i++) { + x = 1, y = 2; + r = x; + x = y; + y = r; + assert.strictEqual(x, 2); + assert.strictEqual(y, 1); + } + bench.end(n / 1e6); +} + +function runSwapDestructured(n) { + var i = 0, x, y; + bench.start(); + for (; i < n; i++) { + x = 1, y = 2; + [x, y] = [y, x]; + assert.strictEqual(x, 2); + assert.strictEqual(y, 1); + } + bench.end(n / 1e6); +} + +function main(conf) { + const n = +conf.millions * 1e6; + + switch (conf.method) { + case 'swap': + runSwapManual(n); + break; + case 'destructure': + runSwapDestructured(n); + break; + default: + throw new Error('Unexpected method'); + } +} diff --git a/benchmark/es/restparams-bench.js b/benchmark/es/restparams-bench.js new file mode 100644 index 0000000000..0ff9c48ded --- /dev/null +++ b/benchmark/es/restparams-bench.js @@ -0,0 +1,85 @@ +'use strict'; + +const common = require('../common.js'); +const assert = require('assert'); + +const bench = common.createBenchmark(main, { + method: ['copy', 'rest', 'arguments'], + millions: [100] +}); + +function copyArguments() { + var len = arguments.length; + var args = new Array(len); + for (var i = 0; i < len; i++) + args[i] = arguments[i]; + assert.strictEqual(args[0], 1); + assert.strictEqual(args[1], 2); + assert.strictEqual(args[2], 'a'); + assert.strictEqual(args[3], 'b'); +} + +function restArguments(...args) { + assert.strictEqual(args[0], 1); + assert.strictEqual(args[1], 2); + assert.strictEqual(args[2], 'a'); + assert.strictEqual(args[3], 'b'); +} + +function useArguments() { + assert.strictEqual(arguments[0], 1); + assert.strictEqual(arguments[1], 2); + assert.strictEqual(arguments[2], 'a'); + assert.strictEqual(arguments[3], 'b'); +} + +function runCopyArguments(n) { + + common.v8ForceOptimization(copyArguments, 1, 2, 'a', 'b'); + + var i = 0; + bench.start(); + for (; i < n; i++) + copyArguments(1, 2, 'a', 'b'); + bench.end(n / 1e6); +} + +function runRestArguments(n) { + + common.v8ForceOptimization(restArguments, 1, 2, 'a', 'b'); + + var i = 0; + bench.start(); + for (; i < n; i++) + restArguments(1, 2, 'a', 'b'); + bench.end(n / 1e6); +} + +function runUseArguments(n) { + + common.v8ForceOptimization(useArguments, 1, 2, 'a', 'b'); + + var i = 0; + bench.start(); + for (; i < n; i++) + useArguments(1, 2, 'a', 'b'); + bench.end(n / 1e6); +} + +function main(conf) { + const n = +conf.millions * 1e6; + + switch (conf.method) { + case 'copy': + runCopyArguments(n); + break; + case 'rest': + runRestArguments(n); + break; + case 'arguments': + runUseArguments(n); + break; + default: + throw new Error('Unexpected method'); + } +} -- cgit v1.2.3