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