Skip to content

Commit

Permalink
Merge dbcb71a into ecc63d0
Browse files Browse the repository at this point in the history
  • Loading branch information
gkhandake committed Jul 13, 2023
2 parents ecc63d0 + dbcb71a commit abd1389
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 1 deletion.
7 changes: 7 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1637,6 +1637,13 @@ if(BUILD_SHARED)
if(ZMQ_HAVE_WINDOWS_UWP)
set_target_properties(benchmark_radix_tree PROPERTIES LINK_FLAGS_DEBUG "/OPT:NOICF /OPT:NOREF")
endif()

add_executable(benchmark_generic_mtrie perf/benchmark_generic_mtrie.cpp)
target_link_libraries(benchmark_gneric_mtrie libzmq-static)
target_include_directories(benchmark_generic_mtrie PUBLIC "${CMAKE_CURRENT_LIST_DIR}/src")
if(ZMQ_HAVE_WINDOWS_UWP)
set_target_properties(benchmark_generic_mtrie PROPERTIES LINK_FLAGS_DEBUG "/OPT:NOICF /OPT:NOREF")
endif()
endif()
elseif(WITH_PERF_TOOL)
message(FATAL_ERROR "Shared library disabled - perf-tools unavailable.")
Expand Down
9 changes: 8 additions & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -414,13 +414,20 @@ perf_proxy_thr_SOURCES = perf/proxy_thr.cpp

if ENABLE_STATIC
noinst_PROGRAMS += \
perf/benchmark_radix_tree
perf/benchmark_radix_tree \
perf/benchmark_generic_mtrie

perf_benchmark_radix_tree_DEPENDENCIES = src/libzmq.la
perf_benchmark_radix_tree_CPPFLAGS = -I$(top_srcdir)/src
perf_benchmark_radix_tree_LDADD = $(top_builddir)/src/.libs/libzmq.a \
${src_libzmq_la_LIBADD}
perf_benchmark_radix_tree_SOURCES = perf/benchmark_radix_tree.cpp

perf_benchmark_generic_mtrie_DEPENDENCIES = src/libzmq.la
perf_benchmark_generic_mtrie_CPPFLAGS = -I$(top_srcdir)/src
perf_benchmark_generic_mtrie_LDADD = $(top_builddir)/src/.libs/libzmq.a \
${src_libzmq_la_LIBADD}
perf_benchmark_generic_mtrie_SOURCES = perf/benchmark_generic_mtrie.cpp
endif
endif

Expand Down
114 changes: 114 additions & 0 deletions perf/benchmark_generic_mtrie.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/* SPDX-License-Identifier: MPL-2.0 */

#if __cplusplus >= 201103L

#include "generic_mtrie_impl.hpp"

#include <chrono>
#include <cstdio>
#include <random>
#include <ratio>
#include <vector>
#include <string>

const std::size_t nprefix = 1000000;
const std::size_t samples = 10;

template <class T>
void benchmark_add (
T &subscriptions_,
std::vector<std::pair<zmq::generic_mtrie_t<uint64_t>::prefix_t, size_t> >
&prefixes_,
uint64_t *pipes_)
{
using namespace std::chrono;
std::vector<duration<long, std::nano> > samples_vec;
samples_vec.reserve (samples);

for (std::size_t run = 0; run < samples; ++run) {
duration<long, std::nano> interval (0);
for (std::size_t i = 0; i < prefixes_.size (); i++) {
auto start = steady_clock::now ();
subscriptions_.add (prefixes_[i].first, prefixes_[i].second,
&pipes_[i]);
auto end = steady_clock::now ();
interval += end - start;
}
samples_vec.push_back (interval / prefixes_.size ());
}

std::size_t sum = 0;
for (const auto &sample : samples_vec)
sum += sample.count ();
std::printf ("Average operation time = %.1lf ns\n",
static_cast<double> (sum) / samples);
}

template <class T>
void benchmark_rm (
T &subscriptions_,
std::vector<std::pair<zmq::generic_mtrie_t<uint64_t>::prefix_t, size_t> >
&prefixes_,
uint64_t *pipes_)
{
using namespace std::chrono;
std::vector<duration<long, std::nano> > samples_vec;
samples_vec.reserve (samples);

for (std::size_t run = 0; run < samples; ++run) {
duration<long, std::nano> interval (0);
for (std::size_t i = 0; i < prefixes_.size (); i++) {
auto start = steady_clock::now ();
subscriptions_.rm (prefixes_[i].first, prefixes_[i].second,
&pipes_[i]);
auto end = steady_clock::now ();
interval += end - start;
}
samples_vec.push_back (interval / prefixes_.size ());
}

std::size_t sum = 0;
for (const auto &sample : samples_vec)
sum += sample.count ();
std::printf ("Average operation time = %.1lf ns\n",
static_cast<double> (sum) / samples);
}

int main ()
{
// Generate input set.
uint64_t pipes[nprefix];
std::vector<std::pair<zmq::generic_mtrie_t<uint64_t>::prefix_t, size_t> >
prefixes;
prefixes.reserve (nprefix);
for (std::size_t i = 0; i < nprefix; ++i) {
char prefix[100];
size_t len = sprintf (prefix, "prefix_%lu", i);
prefixes.push_back (std::make_pair (
reinterpret_cast<zmq::generic_mtrie_t<uint64_t>::prefix_t> (prefix),
len));
}

// Initialize data structures.
//
// Keeping initialization out of the benchmarking function helps
// heaptrack detect peak memory consumption of the radix tree.
zmq::generic_mtrie_t<uint64_t> mtrie;

// Create a benchmark.
std::printf ("prefixes = %llu\n",
static_cast<unsigned long long> (nprefix));
std::puts ("[generic_mtrie::add]");
benchmark_add (mtrie, prefixes, pipes);

std::puts ("[generic_mtrie::rm]");
benchmark_rm (mtrie, prefixes, pipes);
}

#else

int main ()
{
}

#endif

0 comments on commit abd1389

Please sign in to comment.