|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // 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 <array> | 
|  | #include <benchmark/benchmark.h> | 
|  | #include <cstring> | 
|  | #include <numeric> | 
|  | #include <random> | 
|  |  | 
|  | template <class T> | 
|  | static std::array<T, 1000> generate(std::uniform_int_distribution<T> distribution = std::uniform_int_distribution<T>{ | 
|  | std::numeric_limits<T>::min() + 1, std::numeric_limits<T>::max()}) { | 
|  | std::mt19937 generator; | 
|  | std::array<T, 1000> 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<int>(); | 
|  | 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<int>(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(); |