From 2ade52e93bc85a83f76c12ceea52d3b723029ff5 Mon Sep 17 00:00:00 2001 From: Sathya Gunasekaran Date: Tue, 3 Apr 2018 14:18:09 -0700 Subject: [PATCH] Reland "[test] Add JSTest benchmark for object literal spread" This reverts commit cd1dd34f2023ca0853a4fc826aadf810f3bd9c85. Patchset 1 is the original CL that was reverted. Patchset 2 has the fix. TBR=bmeurer@chromium.org Bug: v8:7611 Change-Id: I15291175ab894ef667c001e1b21b8b220e1f9b48 Reviewed-on: https://chromium-review.googlesource.com/993995 Reviewed-by: Sathya Gunasekaran Commit-Queue: Sathya Gunasekaran Cr-Commit-Position: refs/heads/master@{#52337} --- test/js-perf-test/JSTests.json | 15 +++ test/js-perf-test/ObjectLiteralSpread/run.js | 101 +++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 test/js-perf-test/ObjectLiteralSpread/run.js 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..1ae24d827c --- /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('ObjectSpreadLiteral', ObjectSpreadAndOverwrite); + +BenchmarkSuite.config.doWarmup = undefined; +BenchmarkSuite.config.doDeterministic = undefined; +BenchmarkSuite.RunSuites({NotifyResult: PrintResult, NotifyError: PrintError});