21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include "core/ave_deviation_meter.hpp"
25 #include "core/stats_output.hpp"
26 #include "core/unordered_tuple.hpp"
30 #include <unordered_map>
32 using namespace libjmmcg;
37 using key_type=
std::int32_t;
40 constexpr key_type
operator()(key_type k)
const noexcept(
true) {
43 constexpr key_type
operator()(key_type k,
std::size_t)
const noexcept(
true) {
50 virtual unsigned long fn(
unsigned long j)
const=0;
52 struct derived1
final :
base {
55 const unsigned long i_;
60 unsigned long fn(
unsigned long j)
const override {
64 constexpr base::key_type derived1::
hash;
65 struct derived2
final :
base {
68 const unsigned long i_;
73 unsigned long fn(
unsigned long j)
const override {
77 constexpr base::key_type derived2::
hash;
84 BOOST_AUTO_TEST_SUITE(unordered_tuple_tests)
86 BOOST_AUTO_TEST_SUITE(performance, *stats_to_csv::make_fixture(
"unordered_tuple_performance.csv"))
93 BOOST_AUTO_TEST_CASE(unordered_tuple_perf) {
94 using collection_type=unordered_tuple<base::key_type, base, base::hasher, extract, derived1, derived2>;
96 collection_type colln(derived1(667), derived2(42));
98 #ifdef JMMCG_PERFORMANCE_TESTS
99 const unsigned long test_size=2<<22;
101 const unsigned long test_size=2<<2;
103 const unsigned short loops_for_conv=1000;
104 const double perc_conv_estimate=2.0;
106 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
110 const auto t1=std::chrono::high_resolution_clock::now();
111 for (
unsigned long i=0; i<test_size; ++i) {
112 res+=colln[i%2].fn(i);
114 const auto t2=std::chrono::high_resolution_clock::now();
115 return timed_results_t::value_type(
static_cast<
double>(test_size)*1000000/std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count());
118 BOOST_CHECK_GT(res, 0);
119 std::cout<<
typeid(collection_type).name()<<
" operations/sec="<<timed_results.first<<std::endl;
120 #ifdef JMMCG_PERFORMANCE_TESTS
121 stats_to_csv::handle->stats<<timed_results.first.to_csv()<<std::flush;
122 BOOST_CHECK(!timed_results.second);
131 BOOST_AUTO_TEST_CASE(unordered_map_perf) {
132 using base_t=
std::shared_ptr<
base>;
133 using collection_type=std::unordered_map<base::key_type, base_t>;
135 collection_type colln;
136 colln.emplace(derived1::hash, std::make_shared<derived1>(667));
137 colln.emplace(derived2::hash, std::make_shared<derived2>(42));
139 #ifdef JMMCG_PERFORMANCE_TESTS
140 const unsigned long test_size=2<<22;
142 const unsigned long test_size=2<<2;
144 const unsigned short loops_for_conv=1000;
145 const double perc_conv_estimate=2.0;
147 const std::pair<timed_results_t,
bool> timed_results(compute_average_deviation<timed_results_t::value_type>(
151 const auto t1=std::chrono::high_resolution_clock::now();
152 for (
unsigned long i=0; i<test_size; ++i) {
153 res+=colln[i%2]->fn(i);
155 const auto t2=std::chrono::high_resolution_clock::now();
156 return timed_results_t::value_type(
static_cast<
double>(test_size)*1000000/std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count());
159 BOOST_CHECK_GT(res, 0);
160 std::cout<<
typeid(collection_type).name()<<
" operations/sec="<<timed_results.first<<std::endl;
161 #ifdef JMMCG_PERFORMANCE_TESTS
162 stats_to_csv::handle->stats<<timed_results.first.to_csv()<<std::flush;
163 BOOST_CHECK(!timed_results.second);
167 BOOST_AUTO_TEST_SUITE_END()
169 BOOST_AUTO_TEST_SUITE_END()