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)