// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// ignore_for_file: avoid_function_literals_in_foreach_calls

// @dart=2.9

import 'package:benchmark_harness/benchmark_harness.dart';
import 'package:fixnum/fixnum.dart';

import 'native_version_dummy.dart'
    if (dart.library.js) 'native_version_javascript.dart';

// Benckmark BigInt and Int64 formatting and parsing.

// A global sink that is used in the [check] method ensures that the results are
// not optimized.
dynamic sink1, sink2;

void check(bool sink2isEven) {
  if (sink1.codeUnits.last.isEven != sink2isEven) {
    throw StateError('Inconsistent $sink1 vs $sink2');
  }
}

// These benchmarks measure digit-throughput for parsing and formatting.
//
// Each benchmark targets processing [requiredDigits] decimal digits, spread
// over a list of input values. This makes the benchmarks for different integer
// lengths roughly comparable.  The number is chosen so that most benchmarks
// have very close to this number of digits. It corresponds to nine 4096-bit
// integers.
const requiredDigits = 11106;

class ParseBigIntBenchmark extends BenchmarkBase {
  final int bits;
  final BigInt seed;
  final List<String> strings = [];

  ParseBigIntBenchmark(String name, this.bits)
      : seed = (BigInt.one << bits) - BigInt.one,
        super(name);

  @override
  void setup() {
    var b = seed;
    var totalLength = 0;
    while (totalLength < requiredDigits) {
      if (b.bitLength < bits) {
        b = seed;
      }
      final string = b.toString();
      strings.add(string);
      totalLength += string.length;
      b = b - (b >> 8);
    }
  }

  @override
  void run() {
    for (final s in strings) {
      final b = BigInt.parse(s);
      sink1 = s;
      sink2 = b;
    }
    check(sink2.isEven);
  }
}

int int64UnsignedBitLength(Int64 i) => i.isNegative ? 64 : i.bitLength;

class ParseInt64Benchmark extends BenchmarkBase {
  final int bits;
  final Int64 seed;
  final List<String> strings = [];

  ParseInt64Benchmark(String name, this.bits)
      : seed = (Int64.ONE << bits) - Int64.ONE,
        super(name);

  @override
  void setup() {
    var b = seed;
    var totalLength = 0;
    while (totalLength < requiredDigits) {
      if (int64UnsignedBitLength(b) < bits) {
        b = seed;
      }
      final string = b.toStringUnsigned();
      strings.add(string);
      totalLength += string.length;
      b = b - b.shiftRightUnsigned(8);
    }
  }

  @override
  void run() {
    for (final s in strings) {
      final b = Int64.parseInt(s);
      sink1 = s;
      sink2 = b;
    }
    check(sink2.isEven);
  }
}

class ParseJsBigIntBenchmark extends BenchmarkBase {
  final int bits;
  final Object seed;
  final List<String> strings = [];

  ParseJsBigIntBenchmark(String name, this.bits)
      : seed = nativeBigInt.subtract(
            nativeBigInt.shiftLeft(
                nativeBigInt.one, nativeBigInt.fromInt(bits)),
            nativeBigInt.one),
        super(name);

  @override
  void setup() {
    var b = seed;
    var totalLength = 0;
    while (totalLength < requiredDigits) {
      if (nativeBigInt.bitLength(b) < bits) {
        b = seed;
      }
      final string = nativeBigInt.toStringMethod(b);
      strings.add(string);
      totalLength += string.length;
      b = nativeBigInt.subtract(
          b, nativeBigInt.shiftRight(b, nativeBigInt.eight));
    }
  }

  @override
  void run() {
    for (final s in strings) {
      final b = nativeBigInt.parse(s);
      sink1 = s;
      sink2 = b;
    }
    check(nativeBigInt.isEven(sink2));
  }
}

class FormatBigIntBenchmark extends BenchmarkBase {
  final int bits;
  final BigInt seed;
  final List<BigInt> values = [];

  FormatBigIntBenchmark(String name, this.bits)
      : seed = (BigInt.one << bits) - BigInt.one,
        super(name);

  @override
  void setup() {
    var b = seed;
    var totalLength = 0;
    while (totalLength < requiredDigits) {
      if (b.bitLength < bits) {
        b = seed;
      }
      final string = b.toString();
      values.add(b - BigInt.one); // We add 'one' back later.
      totalLength += string.length;
      b = b - (b >> 8);
    }
  }

  @override
  void run() {
    final one = BigInt.one;
    for (final b0 in values) {
      // Instances might cache `toString()`, so use arithmetic to create a new
      // instance to try to protect against measuring a cached string.
      final b = b0 + one;
      final s = b.toString();
      sink1 = s;
      sink2 = b;
    }
    check(sink2.isEven);
  }
}

class FormatInt64Benchmark extends BenchmarkBase {
  final int bits;
  final Int64 seed;
  final List<Int64> values = [];

  FormatInt64Benchmark(String name, this.bits)
      : seed = (Int64.ONE << bits) - Int64.ONE,
        super(name);

  @override
  void setup() {
    var b = seed;
    var totalLength = 0;
    while (totalLength < requiredDigits) {
      if (int64UnsignedBitLength(b) < bits) {
        b = seed;
      }
      final string = b.toStringUnsigned();
      values.add(b - Int64.ONE);
      totalLength += string.length;
      b = b - b.shiftRightUnsigned(8);
    }
  }

  @override
  void run() {
    final one = Int64.ONE;
    for (final b0 in values) {
      // Instances might cache `toString()`, so use arithmetic to create a new
      // instance to try to protect against measuring a cached string.
      final b = b0 + one;
      final s = b.toStringUnsigned();
      sink1 = s;
      sink2 = b;
    }
    check(sink2.isEven);
  }
}

class FormatJsBigIntBenchmark extends BenchmarkBase {
  final int bits;
  final Object seed;
  final List<Object> values = [];

  FormatJsBigIntBenchmark(String name, this.bits)
      : seed = nativeBigInt.subtract(
            nativeBigInt.shiftLeft(
                nativeBigInt.one, nativeBigInt.fromInt(bits)),
            nativeBigInt.one),
        super(name);

  @override
  void setup() {
    final one = nativeBigInt.one;
    var b = seed;
    var totalLength = 0;
    while (totalLength < requiredDigits) {
      if (nativeBigInt.bitLength(b) < bits) {
        b = seed;
      }
      final string = nativeBigInt.toStringMethod(b);
      values.add(nativeBigInt.subtract(b, one)); // We add 'one' back later.
      totalLength += string.length;
      b = nativeBigInt.subtract(
          b, nativeBigInt.shiftRight(b, nativeBigInt.eight));
    }
  }

  @override
  void run() {
    final one = nativeBigInt.one;
    for (final b0 in values) {
      // Instances might cache `toString()`, so use arithmetic to create a new
      // instance to try to protect against measuring a cached string.
      final b = nativeBigInt.add(b0, one);
      final s = nativeBigInt.toStringMethod(b);
      sink1 = s;
      sink2 = b;
    }
    check(nativeBigInt.isEven(sink2));
  }
}

/// [DummyBenchmark] instantly returns a fixed 'slow' result.
class DummyBenchmark extends BenchmarkBase {
  DummyBenchmark(String name) : super(name);
  @override
  double measure() => 2000 * 1000 * 1.0; // A rate of one run per 2s.
}

/// Create [ParseJsBigIntBenchmark], or a dummy benchmark if JavaScript BigInt
/// is not available.  This is to satisfy Golem's constraint that group
/// benchmarks always produce results for the same set of series.
BenchmarkBase Function() selectParseNativeBigIntBenchmark(
    String name, int bits) {
  return nativeBigInt.enabled
      ? () => ParseJsBigIntBenchmark(name, bits)
      : () => DummyBenchmark(name);
}

/// Create [FormatJsBigIntBenchmark], or a dummy benchmark if JavaScript BigInt
/// is not available.  This is to satisfy Golem's constraint that group
/// benchmarks always produce results for the same set of series.
BenchmarkBase Function() selectFormatNativeBigIntBenchmark(
    String name, int bits) {
  return nativeBigInt.enabled
      ? () => FormatJsBigIntBenchmark(name, bits)
      : () => DummyBenchmark(name);
}

void main() {
  final benchmarks = [
    () => ParseInt64Benchmark('Int64.parse.0009.bits', 9),
    () => ParseInt64Benchmark('Int64.parse.0032.bits', 32),
    () => ParseInt64Benchmark('Int64.parse.0064.bits', 64),
    () => ParseBigIntBenchmark('BigInt.parse.0009.bits', 9),
    () => ParseBigIntBenchmark('BigInt.parse.0032.bits', 32),
    () => ParseBigIntBenchmark('BigInt.parse.0064.bits', 64),
    () => ParseBigIntBenchmark('BigInt.parse.0256.bits', 256),
    () => ParseBigIntBenchmark('BigInt.parse.1024.bits', 1024),
    () => ParseBigIntBenchmark('BigInt.parse.4096.bits', 4096),
    selectParseNativeBigIntBenchmark('JsBigInt.parse.0009.bits', 9),
    selectParseNativeBigIntBenchmark('JsBigInt.parse.0032.bits', 32),
    selectParseNativeBigIntBenchmark('JsBigInt.parse.0064.bits', 64),
    selectParseNativeBigIntBenchmark('JsBigInt.parse.0256.bits', 256),
    selectParseNativeBigIntBenchmark('JsBigInt.parse.1024.bits', 1024),
    selectParseNativeBigIntBenchmark('JsBigInt.parse.4096.bits', 4096),
    () => FormatInt64Benchmark('Int64.toString.0009.bits', 9),
    () => FormatInt64Benchmark('Int64.toString.0032.bits', 32),
    () => FormatInt64Benchmark('Int64.toString.0064.bits', 64),
    () => FormatBigIntBenchmark('BigInt.toString.0009.bits', 9),
    () => FormatBigIntBenchmark('BigInt.toString.0032.bits', 32),
    () => FormatBigIntBenchmark('BigInt.toString.0064.bits', 64),
    () => FormatBigIntBenchmark('BigInt.toString.0256.bits', 256),
    () => FormatBigIntBenchmark('BigInt.toString.1024.bits', 1024),
    () => FormatBigIntBenchmark('BigInt.toString.4096.bits', 4096),
    selectFormatNativeBigIntBenchmark('JsBigInt.toString.0009.bits', 9),
    selectFormatNativeBigIntBenchmark('JsBigInt.toString.0032.bits', 32),
    selectFormatNativeBigIntBenchmark('JsBigInt.toString.0064.bits', 64),
    selectFormatNativeBigIntBenchmark('JsBigInt.toString.0256.bits', 256),
    selectFormatNativeBigIntBenchmark('JsBigInt.toString.1024.bits', 1024),
    selectFormatNativeBigIntBenchmark('JsBigInt.toString.4096.bits', 4096),
  ];

  // Warm up all benchmarks to ensure consistent behavious of shared code.
  benchmarks.forEach((bm) => bm()
    ..setup()
    ..run()
    ..run());

  benchmarks.forEach((bm) => bm().report());
}
