mirror of
https://github.com/zeromq/libzmq.git
synced 2025-10-25 18:23:01 +02:00
Problem: trie benchmarks count loop times instead of lookup calls (#3406)
* Problem: trie benchmarks count loop times instead of lookup calls Solution: measure the time taken by each lookup call instead Other changes: - show average time taken and reduce other output - show number of keys, queries and key size before running the benchmark - use steady_clock as high_resolution_clock might not be steady - increase size of query set to 1M
This commit is contained in:
committed by
Luca Boccassi
parent
6937447832
commit
8ef72d482e
@@ -36,10 +36,11 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
#include <ratio>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
const std::size_t nkeys = 10000;
|
const std::size_t nkeys = 10000;
|
||||||
const std::size_t nqueries = 100000;
|
const std::size_t nqueries = 1000000;
|
||||||
const std::size_t warmup_runs = 10;
|
const std::size_t warmup_runs = 10;
|
||||||
const std::size_t samples = 10;
|
const std::size_t samples = 10;
|
||||||
const std::size_t key_length = 20;
|
const std::size_t key_length = 20;
|
||||||
@@ -51,27 +52,31 @@ void benchmark_lookup (T &t,
|
|||||||
std::vector<unsigned char *> &input_set,
|
std::vector<unsigned char *> &input_set,
|
||||||
std::vector<unsigned char *> &queries)
|
std::vector<unsigned char *> &queries)
|
||||||
{
|
{
|
||||||
std::puts ("Starting warmup...");
|
using namespace std::chrono;
|
||||||
|
std::vector<duration<long, std::nano>> samples_vec;
|
||||||
|
samples_vec.reserve (samples);
|
||||||
|
|
||||||
for (std::size_t run = 0; run < warmup_runs; ++run) {
|
for (std::size_t run = 0; run < warmup_runs; ++run) {
|
||||||
for (auto &query : queries)
|
for (auto &query : queries)
|
||||||
t.check (query, key_length);
|
t.check (query, key_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::puts ("Collecting samples...");
|
|
||||||
std::vector<double> samples_vec;
|
|
||||||
samples_vec.reserve (samples);
|
|
||||||
for (std::size_t run = 0; run < samples; ++run) {
|
for (std::size_t run = 0; run < samples; ++run) {
|
||||||
auto start = std::chrono::high_resolution_clock::now ();
|
duration<long, std::nano> interval (0);
|
||||||
for (auto &query : queries)
|
for (auto &query : queries) {
|
||||||
|
auto start = steady_clock::now ();
|
||||||
t.check (query, key_length);
|
t.check (query, key_length);
|
||||||
auto end = std::chrono::high_resolution_clock::now ();
|
auto end = steady_clock::now ();
|
||||||
samples_vec.push_back (
|
interval += end - start;
|
||||||
std::chrono::duration_cast<std::chrono::milliseconds> ((end - start))
|
}
|
||||||
.count ());
|
samples_vec.push_back (interval / queries.size ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::size_t sum = 0;
|
||||||
for (const auto &sample : samples_vec)
|
for (const auto &sample : samples_vec)
|
||||||
std::printf ("%.2lf\n", sample);
|
sum += sample.count ();
|
||||||
|
std::printf ("Average lookup time = %.1lf ns\n",
|
||||||
|
static_cast<double> (sum) / samples);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main ()
|
int main ()
|
||||||
@@ -104,6 +109,10 @@ int main ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a benchmark.
|
// Create a benchmark.
|
||||||
|
std::printf ("keys = %llu, queries = %llu, key size = %llu\n",
|
||||||
|
static_cast<unsigned long long> (nkeys),
|
||||||
|
static_cast<unsigned long long> (nqueries),
|
||||||
|
static_cast<unsigned long long> (key_length));
|
||||||
std::puts ("[trie]");
|
std::puts ("[trie]");
|
||||||
benchmark_lookup (trie, input_set, queries);
|
benchmark_lookup (trie, input_set, queries);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user