1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
#include <numeric>
uint64_t gcd64(uint64_t u, uint64_t v)
{
if(u == 0) return(v);
if(v == 0) return(u);
int k = __builtin_ctzll(u | v);
u >>= __builtin_ctzll(u);
v >>= __builtin_ctzll(v);
// now u and v are odd
while( u != v ){
if(u > v){
u -= v;
u >>=__builtin_ctzll(u);
}else{
v -= u;
v >>= __builtin_ctzll(v);
}
}
return(u << k);
}
static void std_gcd(benchmark::State& state) {
uint64_t u, v, w;
for (auto _ : state) {
w = std::gcd(u,v);
benchmark::DoNotOptimize(w);
}
}
BENCHMARK(std_gcd);
static void bin_gcd(benchmark::State& state) {
uint64_t u, v, w;
for (auto _ : state) {
w = gcd64(u,v);
benchmark::DoNotOptimize(w);
}
}
BENCHMARK(bin_gcd); |