36#include <boost/chrono.hpp>
37#include <boost/regex.hpp>
47 typedef boost::chrono::high_resolution_clock
clock;
61 clock::duration elapsed = clock::now() -
m_start;
62 return static_cast<int>(boost::chrono::duration_cast<boost::chrono::milliseconds>(elapsed).count());
91 static_assert(0 < T::loop_count,
"T::loop_count must be greater than 0");
101 std::cout <<
"Warm up: " << timer.
elapsed_ms() <<
" ms" << std::endl;
104 for (
size_t i = 0; i < T::loop_count *
m_params.loop_multiplier; ++i)
124 static_assert(0 < T::loop_count,
"T::loop_count must be greater than 0");
138 return m_stats->is_same_distribution_99(npoints, mean, stddev);
147 const size_t warm_up_rounds = 1000 * 1000 * 1000;
149 for (
size_t i = 0; i < warm_up_rounds; ++i)
161 std::unique_ptr<Stats<tools::PerformanceTimer, uint64_t>>
m_stats;
168 if (!filter.empty() && !boost::regex_match(std::string(test_name), match, boost::regex(filter)))
176 std::cout << test_name <<
" - OK:\n";
177 std::cout <<
" loop count: " << T::loop_count * params.
loop_multiplier <<
'\n';
178 std::cout <<
" elapsed: " << runner.
elapsed_time() <<
" ms\n";
181 std::cout <<
" min: " << runner.
get_min() <<
" ns\n";
182 std::cout <<
" max: " << runner.
get_max() <<
" ns\n";
183 std::cout <<
" median: " << runner.
get_median() <<
" ns\n";
184 std::cout <<
" std dev: " << runner.
get_stddev() <<
" ns\n";
189 std::cout << test_name <<
" (" << T::loop_count * params.
loop_multiplier <<
" calls) - OK:";
191 const char *unit =
"ms";
192 double scale = 1000000;
194 if (time_per_call < 100) {
211 std::vector<TimingsDatabase::instance> prev_instances = params.
td.
get(test_name);
212 params.
td.
add(test_name, {time(NULL), runner.
get_size(),
min, max, mean, med, stddev, npskew, quantiles});
214 std::cout << (params.
verbose ?
" time per call: " :
" ") << time_per_call <<
" " << unit <<
"/call" << (params.
verbose ?
"\n" :
"");
219 uint64_t p95s = quantiles[9] / scale;
222 if (!prev_instances.empty())
227 double pc = fabs(100. * (prev_instance.
mean - runner.
get_mean()) / prev_instance.
mean);
228 cmp =
", " + std::to_string(pc) +
"% " + (mean > prev_instance.
mean ?
"slower" :
"faster");
230cmp +=
" -- " + std::to_string(prev_instance.
mean);
232 std::cout <<
" (min " << mins <<
" " << unit <<
", 90th " << p95s <<
" " << unit <<
", median " << meds <<
" " << unit <<
", std dev " << stddevs <<
" " << unit <<
")" << cmp;
234 std::cout << std::endl;
238 std::cout << test_name <<
" - FAILED" << std::endl;
243#define TEST_PERFORMANCE0(filter, params, test_class) run_test< test_class >(filter, params, QUOTEME(test_class))
244#define TEST_PERFORMANCE1(filter, params, test_class, a0) run_test< test_class<a0> >(filter, params, QUOTEME(test_class<a0>))
245#define TEST_PERFORMANCE2(filter, params, test_class, a0, a1) run_test< test_class<a0, a1> >(filter, params, QUOTEME(test_class) "<" QUOTEME(a0) ", " QUOTEME(a1) ">")
246#define TEST_PERFORMANCE3(filter, params, test_class, a0, a1, a2) run_test< test_class<a0, a1, a2> >(filter, params, QUOTEME(test_class) "<" QUOTEME(a0) ", " QUOTEME(a1) ", " QUOTEME(a2) ">")
247#define TEST_PERFORMANCE4(filter, params, test_class, a0, a1, a2, a3) run_test< test_class<a0, a1, a2, a3> >(filter, params, QUOTEME(test_class) "<" QUOTEME(a0) ", " QUOTEME(a1) ", " QUOTEME(a2) ", " QUOTEME(a3) ">")
248#define TEST_PERFORMANCE5(filter, params, test_class, a0, a1, a2, a3, a4) run_test< test_class<a0, a1, a2, a3, a4> >(filter, params, QUOTEME(test_class) "<" QUOTEME(a0) ", " QUOTEME(a1) ", " QUOTEME(a2) ", " QUOTEME(a3) ", " QUOTEME(a4) ">")
249#define TEST_PERFORMANCE6(filter, params, test_class, a0, a1, a2, a3, a4, a5) run_test< test_class<a0, a1, a2, a3, a4, a5> >(filter, params, QUOTEME(test_class) "<" QUOTEME(a0) ", " QUOTEME(a1) ", " QUOTEME(a2) ", " QUOTEME(a3) ", " QUOTEME(a4) ", " QUOTEME(a5) ">")
void add(const char *name, const instance &data)
Definition timings.cc:122
std::vector< instance > get(const char *name) const
Definition timings.cc:112
Definition performance_tests.h:80
Params m_params
Definition performance_tests.h:159
uint64_t get_min() const
Definition performance_tests.h:128
uint64_t get_median() const
Definition performance_tests.h:131
std::unique_ptr< Stats< tools::PerformanceTimer, uint64_t > > m_stats
Definition performance_tests.h:161
test_runner(const Params ¶ms)
Definition performance_tests.h:82
int time_per_call(int scale=1) const
Definition performance_tests.h:122
double get_stddev() const
Definition performance_tests.h:132
std::vector< tools::PerformanceTimer > m_per_call_timers
Definition performance_tests.h:160
double get_non_parametric_skew() const
Definition performance_tests.h:133
volatile uint64_t m_warm_up
! This field is intended for preclude compiler optimizations
Definition performance_tests.h:157
uint64_t warm_up()
Definition performance_tests.h:145
int elapsed_time() const
Definition performance_tests.h:119
std::vector< uint64_t > get_quantiles(size_t n) const
Definition performance_tests.h:134
size_t get_size() const
Definition performance_tests.h:120
bool run()
Definition performance_tests.h:89
uint64_t get_max() const
Definition performance_tests.h:129
bool is_same_distribution(size_t npoints, double mean, double stddev) const
Definition performance_tests.h:136
double get_mean() const
Definition performance_tests.h:130
int m_elapsed
Definition performance_tests.h:158
#define min(a, b)
Definition oaes_lib.c:78
unsigned __int64 uint64_t
Definition stdint.h:136
Definition performance_tests.h:71
unsigned loop_multiplier
Definition performance_tests.h:75
bool stats
Definition performance_tests.h:74
TimingsDatabase td
Definition performance_tests.h:72
bool verbose
Definition performance_tests.h:73
double mean
Definition timings.h:15
size_t npoints
Definition timings.h:14
double stddev
Definition timings.h:15