#include <benchmark/benchmark.h>
#include <vector>
#include <random>

using namespace std;

static void sequentialLoop (benchmark::State& state) {
    int n = state.range(0);
    vector<int> v(n), ord(n);
    iota(ord.begin(), ord.end(), 0);

    for (auto _ : state) {
        for (int i = 0; i < n; i++) v[ord[i]] = ord[i];
        benchmark::DoNotOptimize(v.data());
        benchmark::ClobberMemory();
    }
}
BENCHMARK(sequentialLoop)->RangeMultiplier(2)->Range(1 << 4, 1 << 24);

static void randomizedLoop (benchmark::State& state) {
    int n = state.range(0);
    vector<int> v(n), ord(n);
    iota(ord.begin(), ord.end(), 0);
    shuffle(ord.begin(), ord.end(), mt19937(21));

    for (auto _ : state) {
        for (int i = 0; i < n; i++) v[ord[i]] = ord[i];
        benchmark::DoNotOptimize(v.data());
        benchmark::ClobberMemory();
    }
}
BENCHMARK(randomizedLoop)->RangeMultiplier(2)->Range(1 << 4, 1 << 24);

BENCHMARK_MAIN();