| // 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; |
| } |