1d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier#include <unordered_set>
2d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier#include <vector>
3d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier#include <cstdint>
4d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
5fd2e3e98c1decf5bc600b5962cbbbe8374b5cd3eEric Fiselier#include "benchmark/benchmark.h"
6d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier#include "GenerateInput.hpp"
7d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
8d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselierconstexpr std::size_t TestNumInputs = 1024;
9d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
10d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiseliertemplate <class GenInputs>
11d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiseliervoid BM_Sort(benchmark::State& st, GenInputs gen) {
12d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    using ValueType = typename decltype(gen(0))::value_type;
1330b48cb1b3a0c4fcc1887259bd215ad8738d21b4Eric Fiselier    const auto in = gen(st.range(0));
14d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    std::vector<ValueType> inputs[5];
15d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    auto reset_inputs = [&]() {
16d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier        for (auto& C : inputs) {
17d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier            C = in;
18d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier            benchmark::DoNotOptimize(C.data());
19d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier        }
20d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    };
21d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    reset_inputs();
22d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    while (st.KeepRunning()) {
23d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier        for (auto& I : inputs) {
24d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier            std::sort(I.data(), I.data() + I.size());
25d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier            benchmark::DoNotOptimize(I.data());
26d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier        }
27d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier        st.PauseTiming();
28d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier        reset_inputs();
29d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier        benchmark::ClobberMemory();
30d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier        st.ResumeTiming();
31d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    }
32d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier}
33d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
34d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric FiselierBENCHMARK_CAPTURE(BM_Sort, random_uint32,
35d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    getRandomIntegerInputs<uint32_t>)->Arg(TestNumInputs);
36d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
37d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric FiselierBENCHMARK_CAPTURE(BM_Sort, sorted_ascending_uint32,
38d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    getSortedIntegerInputs<uint32_t>)->Arg(TestNumInputs);
39d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
40d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric FiselierBENCHMARK_CAPTURE(BM_Sort, sorted_descending_uint32,
41d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    getReverseSortedIntegerInputs<uint32_t>)->Arg(TestNumInputs);
42d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
43d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric FiselierBENCHMARK_CAPTURE(BM_Sort, single_element_uint32,
44d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    getDuplicateIntegerInputs<uint32_t>)->Arg(TestNumInputs);
45d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
46d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric FiselierBENCHMARK_CAPTURE(BM_Sort, pipe_organ_uint32,
47d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    getPipeOrganIntegerInputs<uint32_t>)->Arg(TestNumInputs);
48d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
49d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric FiselierBENCHMARK_CAPTURE(BM_Sort, random_strings,
50d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    getRandomStringInputs)->Arg(TestNumInputs);
51d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
52d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric FiselierBENCHMARK_CAPTURE(BM_Sort, sorted_ascending_strings,
53d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    getSortedStringInputs)->Arg(TestNumInputs);
54d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
55d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric FiselierBENCHMARK_CAPTURE(BM_Sort, sorted_descending_strings,
56d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    getReverseSortedStringInputs)->Arg(TestNumInputs);
57d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
58d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric FiselierBENCHMARK_CAPTURE(BM_Sort, single_element_strings,
59d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier    getDuplicateStringInputs)->Arg(TestNumInputs);
60d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
61d9b9ef75a8ada5f9caaf2f4984bfb8094ade2590Eric Fiselier
62fd2e3e98c1decf5bc600b5962cbbbe8374b5cd3eEric FiselierBENCHMARK_MAIN();
63