1#ifndef BMTIMER__H__INCLUDED__
2#define BMTIMER__H__INCLUDED__
39template<
typename TOut=std::ostream>
47 std::chrono::duration<double, std::milli>
duration;
52 statistics(std::chrono::duration<double, std::milli> d,
unsigned r)
70 const std::string name,
79 start_ = std::chrono::steady_clock::now();
96 void stop(
bool silent=
false)
98 finish_ = std::chrono::steady_clock::now();
103 typename duration_map_type::iterator it =
dmap_->find(
name_);
104 if (it ==
dmap_->end())
106 (*dmap_)[
name_] = st;
118 auto ms = std::chrono::duration <double, std::milli> (diff).count();
130 template<
typename DT>
135 double sec = ms / 1000;
138 double min = sec / 60;
139 tout << name <<
"; " << std::setprecision(4) << min <<
" min" << std::endl;
142 tout << name <<
"; " << std::setprecision(4) << sec <<
" sec" << std::endl;
145 tout << name <<
"; " << ms <<
" ms" << std::endl;
152 typename duration_map_type::const_iterator it = dmap.begin();
153 typename duration_map_type::const_iterator it_end = dmap.end();
155 for ( ;it != it_end; ++it)
169 auto ms = it->second.duration.count();
175 unsigned iops = (unsigned)((
double)st.
repeats / (double)it->second.duration.count()) * 1000;
178 tout << it->first <<
"; " << iops <<
" ops/sec" << std::endl;
182 double ops = ((double)st.
repeats / (
double)it->second.duration.count()) * 1000;
183 tout << it->first <<
"; " << std::setprecision(4) << ops <<
" ops/sec" << std::endl;
193 unsigned iops = (unsigned)((
double)st.
repeats / (double)it->second.duration.count()) * 1000;
196 tout << it->first <<
"; " << iops <<
" ops/sec; "
197 << std::setprecision(4) << it->second.duration.count() <<
" ms" << std::endl;
201 double sec = double(it->second.duration.count()) / 1000;
202 double ops = ((double)st.
repeats / (
double)it->second.duration.count()) * 1000;
203 tout << it->first <<
"; " << std::setprecision(4) << ops <<
" ops/sec; "
204 << std::setprecision(4) << sec <<
" sec." << std::endl;
222 std::chrono::time_point<std::chrono::steady_clock>
start_;
223 std::chrono::time_point<std::chrono::steady_clock>
finish_;
Utility class to collect performance measurements and statistics.
duration_map_type * dmap_
chrono_taker(const chrono_taker &)=delete
void stop(bool silent=false)
chrono_taker(TOut &tout, const std::string name, unsigned repeats=1, duration_map_type *dmap=0)
std::chrono::time_point< std::chrono::steady_clock > finish_
std::map< std::string, statistics > duration_map_type
test name to duration map
chrono_taker & operator=(const chrono_taker)=delete
void add_repeats(unsigned inc)
static void print_duration_map(TOut &tout, const duration_map_type &dmap, format fmt=ct_time)
std::chrono::time_point< std::chrono::steady_clock > start_
static void print_duration(TOut &tout, const std::string &name, DT ms)
std::chrono::duration< double, std::milli > duration
statistics(std::chrono::duration< double, std::milli > d, unsigned r)