1*d1b311d7SLouis Dionne //===----------------------------------------------------------------------===// 2*d1b311d7SLouis Dionne // 3*d1b311d7SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*d1b311d7SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5*d1b311d7SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*d1b311d7SLouis Dionne // 7*d1b311d7SLouis Dionne //===----------------------------------------------------------------------===// 8*d1b311d7SLouis Dionne 9*d1b311d7SLouis Dionne // UNSUPPORTED: c++03 10*d1b311d7SLouis Dionne 11*d1b311d7SLouis Dionne #include <cstdint> 12*d1b311d7SLouis Dionne #include <cstddef> 13*d1b311d7SLouis Dionne #include <functional> 14*d1b311d7SLouis Dionne 15*d1b311d7SLouis Dionne #include "benchmark/benchmark.h" 16*d1b311d7SLouis Dionne 17*d1b311d7SLouis Dionne #include "GenerateInput.h" 18*d1b311d7SLouis Dionne #include "test_macros.h" 19*d1b311d7SLouis Dionne 20*d1b311d7SLouis Dionne constexpr std::size_t TestNumInputs = 1024; 21*d1b311d7SLouis Dionne 22*d1b311d7SLouis Dionne template <class HashFn, class GenInputs> 23*d1b311d7SLouis Dionne void BM_Hash(benchmark::State& st, HashFn fn, GenInputs gen) { 24*d1b311d7SLouis Dionne auto in = gen(st.range(0)); 25*d1b311d7SLouis Dionne const auto end = in.data() + in.size(); 26*d1b311d7SLouis Dionne std::size_t last_hash = 0; 27*d1b311d7SLouis Dionne benchmark::DoNotOptimize(&last_hash); 28*d1b311d7SLouis Dionne while (st.KeepRunning()) { 29*d1b311d7SLouis Dionne for (auto it = in.data(); it != end; ++it) { 30*d1b311d7SLouis Dionne benchmark::DoNotOptimize(last_hash += fn(*it)); 31*d1b311d7SLouis Dionne } 32*d1b311d7SLouis Dionne benchmark::ClobberMemory(); 33*d1b311d7SLouis Dionne } 34*d1b311d7SLouis Dionne } 35*d1b311d7SLouis Dionne 36*d1b311d7SLouis Dionne BENCHMARK_CAPTURE(BM_Hash, uint32_random_std_hash, std::hash<uint32_t>{}, getRandomIntegerInputs<uint32_t>) 37*d1b311d7SLouis Dionne ->Arg(TestNumInputs); 38*d1b311d7SLouis Dionne 39*d1b311d7SLouis Dionne BENCHMARK_CAPTURE(BM_Hash, uint32_top_std_hash, std::hash<uint32_t>{}, getSortedTopBitsIntegerInputs<uint32_t>) 40*d1b311d7SLouis Dionne ->Arg(TestNumInputs); 41*d1b311d7SLouis Dionne 42*d1b311d7SLouis Dionne BENCHMARK_MAIN(); 43