// 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 double arrays.

const largeHoleyArray = new Array(1e5);

for (var i = 0; i < 100; i++) {
  largeHoleyArray[i] = i + 6.66;
}

for (var i = 5000; i < 5500; i++) {
  largeHoleyArray[i] = i + 6.66;
}

// ----------------------------------------------------------------------------
// 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 + '-ArrayLiteralInitialSpreadLargeDoubleHoley(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);

BenchmarkSuite.config.doWarmup = true;
BenchmarkSuite.config.doDeterministic = true;
BenchmarkSuite.RunSuites({NotifyResult: PrintResult, NotifyError: PrintError});
