xref: /llvm-project/libcxx/test/benchmarks/hash.bench.cpp (revision b2d2494731976ab7aa9702f3134472db694b9332)
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