// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/foundation.dart';

import '../common.dart';

const int _kNumIterations = 10;
const int _kNumWarmUp = 100;

class Data {
  Data(this.value);

  Map<String, dynamic> toJson() => <String, dynamic>{ 'value': value };

  final int value;
}

List<Data> test(int length) {
  return List<Data>.generate(length,
      (int index) => Data(index * index));
}

Future<void> main() async {
  assert(false, "Don't run benchmarks in checked mode! Use 'flutter run --release'.");

  // Warm up lap
  for (int i = 0; i < _kNumWarmUp; i += 1) {
    await compute(test, 10);
  }

  final Stopwatch watch = Stopwatch();
  watch.start();
  for (int i = 0; i < _kNumIterations; i += 1) {
    await compute(test, 1000000);
  }
  final int elapsedMicroseconds = watch.elapsedMicroseconds;

  final BenchmarkResultPrinter printer = BenchmarkResultPrinter();
  const double scale = 1000.0 / _kNumIterations;
  printer.addResult(
    description: 'compute',
    value: elapsedMicroseconds * scale,
    unit: 'ns per iteration',
    name: 'compute_iteration',
  );
  printer.printToStdout();
}
