// Copyright 2019 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. "use strict"; load('bigint-util.js'); let initial_sum = 0n; let a = 0n; let random_bigints = []; // This dummy ensures that the feedback for benchmark.run() in the Measure // function from base.js is not monomorphic, thereby preventing the benchmarks // below from being inlined. This ensures consistent behavior and comparable // results. new BenchmarkSuite('Prevent-Inline-Dummy', [10000], [ new Benchmark('Prevent-Inline-Dummy', true, false, 0, () => {}) ]); new BenchmarkSuite('Add-TypeError', [10000], [ new Benchmark('Add-TypeError', true, false, 0, TestAddTypeError, SetUpTestAddTypeError) ]); new BenchmarkSuite('Add-Zero', [1000], [ new Benchmark('Add-Zero', true, false, 0, TestAddZero, SetUpTestAddZero) ]); BITS_CASES.forEach((d) => { new BenchmarkSuite(`Add-SameSign-${d}`, [1000], [ new Benchmark(`Add-SameSign-${d}`, true, false, 0, TestAddSameSign, () => SetUpTestAddSameSign(d)) ]); }); BITS_CASES.forEach((d) => { new BenchmarkSuite(`Add-DifferentSign-${d}`, [1000], [ new Benchmark(`Add-DifferentSign-${d}`, true, false, 0, TestAddDifferentSign, () => SetUpTestAddDifferentSign(d)) ]); }); new BenchmarkSuite('Add-Random', [1000], [ new Benchmark('Add-Random', true, false, 0, TestAddRandom, SetUpTestAddRandom) ]); function SetUpTestAddTypeError() { initial_sum = 42n; } function TestAddTypeError() { let sum = initial_sum; for (let i = 0; i < SLOW_TEST_ITERATIONS; ++i) { try { sum = 0 + sum; } catch(e) { } } return sum; } function SetUpTestAddZero() { initial_sum = 42n; } function TestAddZero() { let sum = initial_sum; for (let i = 0; i < TEST_ITERATIONS; ++i) { sum = 0n + sum; } return sum; } function SetUpTestAddSameSign(bits) { // Add two small random positive values to make sure the sum does not grow // in digits. initial_sum = SmallRandomBigIntWithBits(bits); a = SmallRandomBigIntWithBits(bits); } function TestAddSameSign() { let sum = initial_sum; for (let i = 0; i < TEST_ITERATIONS; ++i) { sum = a + sum; } return sum; } function SetUpTestAddDifferentSign(bits) { // Add a small random negative value to a large positive one to make sure the // sum does not shrink in digits. initial_sum = MaxBigIntWithBits(bits); a = -SmallRandomBigIntWithBits(bits); } function TestAddDifferentSign() { let sum = initial_sum; for (let i = 0; i < TEST_ITERATIONS; ++i) { sum = a + sum; } return sum; } function SetUpTestAddRandom() { random_bigints = []; // RandomBigIntWithBits needs multiples of 4 bits. const max_in_4bits = RANDOM_BIGINTS_MAX_BITS / 4; for (let i = 0; i < TEST_ITERATIONS; ++i) { const bits = Math.floor(Math.random() * max_in_4bits) * 4; const bigint = RandomBigIntWithBits(bits); random_bigints.push(Math.random() < 0.5 ? -bigint : bigint); } } function TestAddRandom() { let sum = 0n; for (let i = 0; i < TEST_ITERATIONS; ++i) { sum = random_bigints[i] + sum; } return sum; }