3 #if __cplusplus >= 201103L
15 const std::size_t nkeys = 10000;
16 const std::size_t nqueries = 1000000;
17 const std::size_t warmup_runs = 10;
19 const std::size_t key_length = 20;
20 const char *chars =
"abcdefghijklmnopqrstuvwxyz0123456789";
21 const int chars_len = 36;
24 void benchmark_lookup (
T &subscriptions_,
25 std::vector<unsigned char *> &queries_)
27 using namespace std::chrono;
28 std::vector<duration<long, std::nano> > samples_vec;
31 for (std::size_t run = 0; run < warmup_runs; ++run) {
32 for (
auto &query : queries_)
33 subscriptions_.check (query, key_length);
36 for (std::size_t run = 0; run <
samples; ++run) {
37 duration<long, std::nano> interval (0);
38 for (
auto &query : queries_) {
39 auto start = steady_clock::now ();
40 subscriptions_.check (query, key_length);
41 auto end = steady_clock::now ();
44 samples_vec.push_back (interval / queries_.size ());
48 for (
const auto &sample : samples_vec)
49 sum += sample.count ();
50 std::printf (
"Average lookup time = %.1lf ns\n",
51 static_cast<double> (sum) /
samples);
57 std::minstd_rand rng (123456789);
58 std::vector<unsigned char *> input_set;
59 std::vector<unsigned char *> queries;
60 input_set.reserve (nkeys);
61 queries.reserve (nqueries);
63 for (std::size_t
i = 0;
i < nkeys; ++
i) {
64 unsigned char *
key =
new unsigned char[key_length];
65 for (std::size_t j = 0; j < key_length; j++)
66 key[j] =
static_cast<unsigned char> (chars[rng () % chars_len]);
67 input_set.emplace_back (
key);
69 for (std::size_t
i = 0;
i < nqueries; ++
i)
70 queries.push_back (input_set[rng () % nkeys]);
78 for (
auto &
key : input_set) {
79 trie.
add (
key, key_length);
80 radix_tree.
add (
key, key_length);
84 std::printf (
"keys = %llu, queries = %llu, key size = %llu\n",
85 static_cast<unsigned long long> (nkeys),
86 static_cast<unsigned long long> (nqueries),
87 static_cast<unsigned long long> (key_length));
89 benchmark_lookup (trie, queries);
91 std::puts (
"[radix_tree]");
92 benchmark_lookup (radix_tree, queries);
94 for (
auto &op : input_set)