1 #ifndef DUNE_PDELAB_COMMON_BENCHMARKHELPER_HH 2 #define DUNE_PDELAB_COMMON_BENCHMARKHELPER_HH 12 #include <dune/common/exceptions.hh> 13 #include <dune/common/ios_state.hh> 25 return static_cast<double>(std::clock()) / static_cast<double>(CLOCKS_PER_SEC);
72 template<
typename TimeSource = DefaultTimeSource>
76 BenchmarkHelper(std::string name, std::size_t max_runs = 1, TimeSource timeSource = TimeSource())
81 , _statistics_stale(true)
83 _run_times.timings.resize(max_runs);
89 if (_run >= _max_runs)
91 DUNE_THROW(Dune::RangeError,
"maximum number of benchmark runs exceeded");
93 _statistics_stale =
true;
94 _run_times.timings[_run].start = _time();
100 ios_base_all_saver ios_saver(s);
101 s << _name <<
" (" << std::setw(2) << _run <<
" of " << std::setw(2) << _max_runs <<
") " << std::flush;
107 _run_times.timings[_run].end = _time();
114 ios_base_all_saver ios_saver(s);
115 s <<
" " << std::setw(10) << std::setprecision(3) << _run_times.timings[_run-1].elapsed() <<
" sec" << std::endl;
121 std::map<std::string,BenchmarkEntry>::iterator,
125 res.first->second.timings.resize(_max_runs);
126 res.first->second.timings[_run].start = _time();
127 _statistics_stale =
true;
130 void start(std::string task, std::ostream&
s)
135 void end(std::string task)
137 _tasks[task].timings[_run].end = _time();
138 _statistics_stale =
true;
141 void end(std::string task, std::ostream&
s)
144 s <<
"." << std::flush;
149 entry.
min = std::numeric_limits<double>::max();
154 for (std::vector<Timing>::iterator it = entry.
timings.begin(), end = entry.
timings.end();
158 const double elapsed = it->elapsed();
159 entry.
min = std::min(entry.
min,elapsed);
160 entry.
max = std::max(entry.
max,elapsed);
161 entry.
avg += elapsed;
162 entry.
std_dev += elapsed*elapsed;
173 for (std::map<std::string,BenchmarkEntry>::iterator it = _tasks.begin(), end = _tasks.end();
177 _max_name_len = std::max(_max_name_len,it->first.size());
178 update_entry(it->second);
181 update_entry(_run_times);
183 _statistics_stale =
false;
188 s << std::setw(_max_name_len + 1) << std::left << name
189 << std::right << std::scientific << std::setw(10) << std::setprecision(2);
191 for (std::vector<Timing>::const_iterator it = entry.
timings.begin(),
196 s << std::setw(10) << it->elapsed();
198 s << std::setw(10) << entry.
min 199 << std::setw(10) << entry.
max 200 << std::setw(10) << entry.
avg 201 << std::setw(10) << entry.
std_dev;
206 void print(std::ostream&
s,
bool summary_only =
false)
208 ios_base_all_saver ios_saver(s);
210 if (_statistics_stale)
213 s << _name <<
" (" << std::setw(2) << _run <<
" of " << std::setw(2) << _max_runs <<
") runs" << std::endl;
215 s << std::setw(_max_name_len + 1) <<
"";
218 for (std::size_t i = 0; i < _max_runs; ++i)
219 s << std::setw(10) << i;
221 s << std::setw(10) <<
"min" 222 << std::setw(10) <<
"max" 223 << std::setw(10) <<
"avg" 224 << std::setw(10) <<
"std_dev" << std::endl;
226 for (std::map<std::string,BenchmarkEntry>::const_iterator it = _tasks.begin(), end = _tasks.end();
229 print_entry(s,it->first,it->second,summary_only);
231 print_entry(s,
"total",_run_times,summary_only);
235 const std::string _name;
238 const std::size_t _max_runs;
239 std::map<std::string,BenchmarkEntry> _tasks;
240 bool _statistics_stale;
242 std::size_t _max_name_len;
251 #endif // DUNE_PDELAB_COMMON_BENCHMARKHELPER_HH Definition: benchmarkhelper.hh:73
double max
Definition: benchmarkhelper.hh:67
double min
Definition: benchmarkhelper.hh:66
void start(std::string task, std::ostream &s)
Definition: benchmarkhelper.hh:130
BenchmarkHelper(std::string name, std::size_t max_runs=1, TimeSource timeSource=TimeSource())
Definition: benchmarkhelper.hh:76
Definition: benchmarkhelper.hh:33
MPIWallTimeSource DefaultTimeSource
Definition: benchmarkhelper.hh:43
void print_entry(std::ostream &s, std::string name, const BenchmarkEntry &entry, bool summary_only=false) const
Definition: benchmarkhelper.hh:186
double start
Definition: benchmarkhelper.hh:53
double operator()() const
Definition: benchmarkhelper.hh:36
Definition: benchmarkhelper.hh:63
Definition: benchmarkhelper.hh:20
double std_dev
Definition: benchmarkhelper.hh:69
void update_statistics()
Definition: benchmarkhelper.hh:170
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
void start_run()
Definition: benchmarkhelper.hh:87
double end
Definition: benchmarkhelper.hh:54
void start_run(std::ostream &s)
Definition: benchmarkhelper.hh:97
void end_run()
Definition: benchmarkhelper.hh:105
void update_entry(BenchmarkEntry &entry)
Definition: benchmarkhelper.hh:147
void end_run(std::ostream &s)
Definition: benchmarkhelper.hh:111
void start(std::string task)
Definition: benchmarkhelper.hh:118
void end(std::string task, std::ostream &s)
Definition: benchmarkhelper.hh:141
double operator()() const
Definition: benchmarkhelper.hh:23
double elapsed() const
Definition: benchmarkhelper.hh:56
double avg
Definition: benchmarkhelper.hh:68
Definition: benchmarkhelper.hh:51
std::vector< Timing > timings
Definition: benchmarkhelper.hh:65
const std::string s
Definition: function.hh:830
void end(std::string task)
Definition: benchmarkhelper.hh:135
void print(std::ostream &s, bool summary_only=false)
Definition: benchmarkhelper.hh:206