167{
168 boost::smatch match;
169 if (!filter.empty() && !boost::regex_match(std::string(test_name), match, boost::regex(filter)))
170 return;
171
173 if (runner.run())
174 {
176 {
177 std::cout << test_name << " - OK:\n";
178 std::cout <<
" loop count: " << T::loop_count * params.
loop_multiplier <<
'\n';
179 std::cout << " elapsed: " << runner.elapsed_time() << " ms\n";
181 {
182 std::cout << " min: " << runner.get_min() << " ns\n";
183 std::cout << " max: " << runner.get_max() << " ns\n";
184 std::cout << " median: " << runner.get_median() << " ns\n";
185 std::cout << " std dev: " << runner.get_stddev() << " ns\n";
186 }
187 }
188 else
189 {
190 std::cout << test_name <<
" (" << T::loop_count * params.
loop_multiplier <<
" calls) - OK:";
191 }
192 const char *
unit =
"ms";
193 double scale = 1000000;
194 uint64_t time_per_call = runner.time_per_call();
195 if (time_per_call < 100) {
196 scale = 1000;
197 time_per_call = runner.time_per_call(1000);
198#ifdef _WIN32
200#else
202#endif
203 }
204 const auto quantiles = runner.get_quantiles(10);
205 double min = runner.get_min();
206 double max = runner.get_max();
207 double med = runner.get_median();
208 double mean = runner.get_mean();
209 double stddev = runner.get_stddev();
210 double npskew = runner.get_non_parametric_skew();
211
212 std::vector<TimingsDatabase::instance> prev_instances = params.
td.
get(test_name);
213 params.
td.
add(test_name, {
time(NULL), runner.get_size(), min, max, mean, med, stddev, npskew, quantiles});
214
215 std::cout << (params.
verbose ?
" time per call: " :
" ") << time_per_call <<
" " << unit <<
"/call" << (params.
verbose ?
"\n" :
"");
217 {
221 uint64_t p95s = quantiles[9] / scale;
223 std::string cmp;
224 if (!prev_instances.empty())
225 {
227 if (!runner.is_same_distribution(prev_instance.
npoints, prev_instance.
mean, prev_instance.
stddev))
228 {
229 double pc = fabs(100. * (prev_instance.
mean - runner.get_mean()) / prev_instance.
mean);
230 cmp =
", " + std::to_string(pc) +
"% " + (mean > prev_instance.
mean ?
"slower" :
"faster");
231 }
232cmp +=
" -- " + std::to_string(prev_instance.
mean);
233 }
234 std::cout <<
" (min " << mins <<
" " <<
unit <<
", 90th " << p95s <<
" " <<
unit <<
", median " << meds <<
" " <<
unit <<
", std dev " << stddevs <<
" " <<
unit <<
")" << cmp;
235 }
236 std::cout << std::endl;
237 }
238 else
239 {
240 std::cout << test_name << " - FAILED" << std::endl;
241 }
242}
std::vector< instance > get(const char *name) const
void add(const char *name, const instance &data)
const base::type::char_t * unit
unsigned __int64 uint64_t