diff --git a/test/js-perf-test/JSTests.json b/test/js-perf-test/JSTests.json index 4f1e39c58d..99e250a080 100644 --- a/test/js-perf-test/JSTests.json +++ b/test/js-perf-test/JSTests.json @@ -351,6 +351,21 @@ {"name": "ValuesMegamorphic"} ] }, + { + "name": "ObjectLiteralSpread", + "path": ["ObjectLiteralSpread"], + "main": "run.js", + "resources": [], + "results_regexp": "^%s\\-ObjectLiteralSpread\\(Score\\): (.+)$", + "tests": [ + {"name": "Babel"}, + {"name": "BabelAndOverwrite"}, + {"name": "ObjectAssign"}, + {"name": "ObjectAssignAndOverwrite"}, + {"name": "ObjectSpread"}, + {"name": "ObjectSpreadAndOverwrite"} + ] + }, { "name": "Scope", "path": ["Scope"], diff --git a/test/js-perf-test/ObjectLiteralSpread/run.js b/test/js-perf-test/ObjectLiteralSpread/run.js new file mode 100644 index 0000000000..b9d7ea0bed --- /dev/null +++ b/test/js-perf-test/ObjectLiteralSpread/run.js @@ -0,0 +1,101 @@ +// Copyright 2018 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +const input = { + a: 1, + b: 2, + c: 3, + ['d']: 4, + 1: 5 +}; + + +// ---------------------------------------------------------------------------- +// Benchmark: Babel +// ---------------------------------------------------------------------------- + +function _extends(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; +}; + +function Babel() { + const result = _extends({}, input); + if (Object.keys(result).length != 5) throw 666; +} + +function BabelAndOverwrite() { + const result = _extends({}, input, {a: 6}); + if (Object.keys(result).length != 5) throw 666; +} + +// ---------------------------------------------------------------------------- +// Benchmark: Object.assign +// ---------------------------------------------------------------------------- + + +function ObjectAssign() { + const result = Object.assign({}, input); + if (Object.keys(result).length != 5) throw 666; +} + +function ObjectAssignAndOverwrite() { + const result = Object.assign({}, input, {a : 6}); + if (Object.keys(result).length != 5) throw 666; +} + + +// ---------------------------------------------------------------------------- +// Benchmark: Object.assign +// ---------------------------------------------------------------------------- + + +function ObjectSpread() { + const result = { ...input }; + if (Object.keys(result).length != 5) throw 666; +} + +function ObjectSpreadAndOverwrite() { + const result = { ...input, a: 6 }; + if (Object.keys(result).length != 5) throw 666; +} + +// ---------------------------------------------------------------------------- +// Setup and Run +// ---------------------------------------------------------------------------- + +load('../base.js'); + +var success = true; + +function PrintResult(name, result) { + print(name + '-ObjectLiteralSpread(Score): ' + result); +} + +function PrintError(name, error) { + PrintResult(name, error); + success = false; +} + +function CreateBenchmark(name, f) { + new BenchmarkSuite(name, [100], [ new Benchmark(name, false, false, 0, f) ]); +} + +CreateBenchmark('Babel', Babel); +CreateBenchmark('BabelAndOverwrite', BabelAndOverwrite); +CreateBenchmark('ObjectAssign', ObjectAssign); +CreateBenchmark('ObjectAssignAndOverwrite', ObjectAssignAndOverwrite); +CreateBenchmark('ObjectSpread', ObjectSpread); +CreateBenchmark('ObjectSpreadAndOverwrite', ObjectSpreadAndOverwrite); + +BenchmarkSuite.config.doWarmup = undefined; +BenchmarkSuite.config.doDeterministic = undefined; +BenchmarkSuite.RunSuites({NotifyResult: PrintResult, NotifyError: PrintError});