//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 #include #include #include #include #include template static std::array generate(std::uniform_int_distribution distribution = std::uniform_int_distribution{ std::numeric_limits::min() + 1, std::numeric_limits::max()}) { std::mt19937 generator; std::array result; std::generate_n(result.begin(), result.size(), [&] { return distribution(generator); }); return result; } static void bm_gcd_random(benchmark::State& state) { std::array data = generate(); while (state.KeepRunningBatch(data.size() * data.size())) for (auto v0 : data) for (auto v1 : data) benchmark::DoNotOptimize(std::gcd(v0, v1)); } BENCHMARK(bm_gcd_random); static void bm_gcd_trivial(benchmark::State& state) { int lhs = ~static_cast(0), rhs = 1; for (auto _ : state) { benchmark::DoNotOptimize(lhs); benchmark::DoNotOptimize(rhs); benchmark::DoNotOptimize(std::gcd(lhs, rhs)); } } BENCHMARK(bm_gcd_trivial); static void bm_gcd_complex(benchmark::State& state) { long long lhs = 2971215073; long long rhs = 1836311903; for (auto _ : state) { benchmark::DoNotOptimize(lhs); benchmark::DoNotOptimize(rhs); benchmark::DoNotOptimize(std::gcd(lhs, rhs)); } } BENCHMARK(bm_gcd_complex); BENCHMARK_MAIN();