| // 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. |
| |
| // Comparing different copy schemes against spread initial literals. |
| // Benchmarks for large holey arrays. |
| |
| const largeHoleyArray = new Array(1e5); |
| |
| for (var i = 0; i < 100; i++) { |
| largeHoleyArray[i] = i; |
| } |
| |
| for (var i = 5000; i < 5500; i++) { |
| largeHoleyArray[i] = i; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Benchmark: Spread |
| // ---------------------------------------------------------------------------- |
| |
| function SpreadLargeHoley() { |
| var newArr = [...largeHoleyArray]; |
| // basic sanity check |
| if (newArr.length != largeHoleyArray.length) throw 666; |
| return newArr; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Benchmark: ForLength |
| // ---------------------------------------------------------------------------- |
| |
| function ForLengthLargeHoley() { |
| var newArr = new Array(largeHoleyArray.length); |
| for (let i = 0; i < largeHoleyArray.length; i++) { |
| newArr[i] = largeHoleyArray[i]; |
| } |
| // basic sanity check |
| if (newArr.length != largeHoleyArray.length) throw 666; |
| return newArr; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Benchmark: ForLengthEmpty |
| // ---------------------------------------------------------------------------- |
| |
| function ForLengthEmptyLargeHoley() { |
| var newArr = []; |
| for (let i = 0; i < largeHoleyArray.length; i++) { |
| newArr[i] = largeHoleyArray[i]; |
| } |
| // basic sanity check |
| if (newArr.length != largeHoleyArray.length) throw 666; |
| return newArr; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Benchmark: Slice |
| // ---------------------------------------------------------------------------- |
| |
| function SliceLargeHoley() { |
| var newArr = largeHoleyArray.slice(); |
| // basic sanity check |
| if (newArr.length != largeHoleyArray.length) throw 666; |
| return newArr; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Benchmark: Slice0 |
| // ---------------------------------------------------------------------------- |
| |
| function Slice0LargeHoley() { |
| var newArr = largeHoleyArray.slice(0); |
| // basic sanity check |
| if (newArr.length != largeHoleyArray.length) throw 666; |
| return newArr; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Benchmark: ConcatReceive |
| // ---------------------------------------------------------------------------- |
| |
| function ConcatReceiveLargeHoley() { |
| var newArr = largeHoleyArray.concat(); |
| // basic sanity check |
| if (newArr.length != largeHoleyArray.length) throw 666; |
| return newArr; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Benchmark: ConcatArg |
| // ---------------------------------------------------------------------------- |
| |
| function ConcatArgLargeHoley() { |
| var newArr = [].concat(largeHoleyArray); |
| // basic sanity check |
| if (newArr.length != largeHoleyArray.length) throw 666; |
| return newArr; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Benchmark: ForOfPush |
| // ---------------------------------------------------------------------------- |
| |
| function ForOfPushLargeHoley() { |
| var newArr = []; |
| for (let x of largeHoleyArray) { |
| newArr.push(x) |
| } |
| // basic sanity check |
| if (newArr.length != largeHoleyArray.length) throw 666; |
| return newArr; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Benchmark: MapId |
| // ---------------------------------------------------------------------------- |
| |
| function MapIdLargeHoley() { |
| var newArr = largeHoleyArray.map(x => x); |
| // basic sanity check |
| if (newArr.length != largeHoleyArray.length) throw 666; |
| return newArr; |
| } |
| |
| // ---------------------------------------------------------------------------- |
| // Setup and Run |
| // ---------------------------------------------------------------------------- |
| |
| load('../base.js'); |
| |
| var success = true; |
| |
| function PrintResult(name, result) { |
| print(name + '-ArrayLiteralInitialSpreadLargeHoley(Score): ' + result); |
| } |
| |
| function PrintError(name, error) { |
| PrintResult('Error: ' + name, error); |
| success = false; |
| } |
| |
| // Run the benchmark (5 x 100) iterations instead of 1 second. |
| function CreateBenchmark(name, f) { |
| new BenchmarkSuite(name, [1000], [ new Benchmark(name, false, false, 5, f) ]); |
| } |
| |
| CreateBenchmark('Spread', SpreadLargeHoley); |
| CreateBenchmark('ForLength', ForLengthLargeHoley); |
| CreateBenchmark('ForLengthEmpty', ForLengthEmptyLargeHoley); |
| CreateBenchmark('Slice', SliceLargeHoley); |
| CreateBenchmark('Slice0', Slice0LargeHoley); |
| CreateBenchmark('ConcatReceive', ConcatReceiveLargeHoley); |
| CreateBenchmark('ConcatArg', ConcatArgLargeHoley); |
| // The following benchmarks are so slow that they will time out. |
| // CreateBenchmark('ForOfPush', ForOfPushLargeHoley); |
| // CreateBenchmark('MapId', MapIdLargeHoley); |
| |
| |
| BenchmarkSuite.config.doWarmup = true; |
| BenchmarkSuite.config.doDeterministic = true; |
| BenchmarkSuite.RunSuites({NotifyResult: PrintResult, NotifyError: PrintError}); |