You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.7 KiB
80 lines
2.7 KiB
#ifndef MEDUSA_BITS_UTILS_TIMER_HPP_
|
|
#define MEDUSA_BITS_UTILS_TIMER_HPP_
|
|
|
|
/**
|
|
* @file
|
|
* Timer class declarations.
|
|
*
|
|
* @example test/utils/Timer_test.cpp
|
|
*/
|
|
|
|
#include <medusa/Config.hpp>
|
|
#include <iostream>
|
|
#include <chrono>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace mm {
|
|
|
|
/**
|
|
* Simple timer class: add checkpoints throughout the code and measure
|
|
* execution time between them.
|
|
* When timing parts of code for example inside loops Stopwatch should be used instead.
|
|
*
|
|
* Usage example:
|
|
* @snippet Timer_test.cpp Timer usage example
|
|
* @sa Stopwatch
|
|
* @ingroup utils
|
|
*/
|
|
class Timer {
|
|
protected:
|
|
typedef std::chrono::steady_clock::time_point time_type; ///< Time type.
|
|
std::vector<std::string> labels_; ///< List of checkpoint labels.
|
|
std::vector<time_type> times_; ///< List of checkpoint times.
|
|
|
|
/// Output timings between the checkpoints with given ids to `os`.
|
|
void showTimings(int from, int to, std::ostream& os = std::cout) const;
|
|
/// Returns the ID of checkpoints with a given label.
|
|
int getID(const std::string& label) const;
|
|
/// Return absolute time for a given `id`.
|
|
time_type timeAt(int id) const;
|
|
public:
|
|
/// Adds a checkpoint with given label and remembers the time at which it was added.
|
|
void addCheckPoint(const std::string& label);
|
|
|
|
/**
|
|
* Pretty print all durations between checkpoints. If there are less than 2 checkpoints,
|
|
* only a warning is printed.
|
|
*/
|
|
void showTimings(std::ostream& os = std::cout) const;
|
|
/**
|
|
* Output duration between the checkpoints with given labels to `os`.
|
|
* Example: `showTimings("begin", "end");`
|
|
*/
|
|
void showTimings(const std::string& from, const std::string& to,
|
|
std::ostream& os = std::cout) const;
|
|
/// Return absolute time for a given label.
|
|
time_type timeAt(const std::string& label) const;
|
|
/// Return time difference in seconds between two checkpoints.
|
|
double duration(const std::string& from, const std::string& to) const;
|
|
/// Return time difference in seconds between `from` and now.
|
|
double durationToNow(const std::string& from) const;
|
|
/// Return the number of measurements taken.
|
|
int size() const { return labels_.size(); }
|
|
/// Return all labels.
|
|
const std::vector<std::string>& labels() const { return labels_; }
|
|
/// Return all times.
|
|
const std::vector<time_type>& times() const { return times_; }
|
|
/// Clear all of time points.
|
|
void clear();
|
|
|
|
/// Output all times between all checkpoints.
|
|
friend std::ostream& operator<<(std::ostream& os, const Timer& timer) {
|
|
timer.showTimings(os);
|
|
return os;
|
|
}
|
|
};
|
|
|
|
} // namespace mm
|
|
|
|
#endif // MEDUSA_BITS_UTILS_TIMER_HPP_
|
|
|