CGRA-ME
CodeProfiling.h
Go to the documentation of this file.
1 #ifndef __UTILITY_TIMING_H__
2 #define __UTILITY_TIMING_H__
3 
4 #include <CGRA/Exception.h>
5 
6 #include <chrono>
7 #include <iostream>
8 #include <string>
9 
27  using Clock = std::chrono::steady_clock;
28  using TimePoint = std::chrono::time_point<Clock>;
29  using TimeEntry = std::pair<std::string, TimePoint>;
30 
31  struct TickResult {
32  bool recorded;
35  };
36 
38  : sequence_name(std::move(sequence_name))
39  , times()
40  {
41  recordTick(makeNowTick("start of " + this->sequence_name), nullptr);
42  }
43 
44  virtual ~ChronoSequence() = default;
45 
46  auto now() const { return Clock::now(); }
47  TimeEntry makeNowTick(std::string timepoint_name) const { return {std::move(timepoint_name), now()}; }
48 
54  TickResult tick(std::string timepoint_name, double threshold = 0.0, std::ostream* os = nullptr) {
55  auto new_entry = makeNowTick(std::move(timepoint_name));
56  auto result = TickResult{
57  false,
58  differenceAsSecondFraction(times.back().second, new_entry.second),
59  differenceAsSecondFraction(times.front().second, new_entry.second),
60  };
61  if (threshold < result.seconds_since_last) {
62  result.recorded = true;
63  recordTick(new_entry, os);
64  }
65  return result;
66  }
67 
68  static double differenceAsSecondFraction(const TimePoint& start, const TimePoint& end) {
69  return std::chrono::duration<double>(end - start).count();
70  }
71 
72  void printTo(std::ostream& os) const {
73  if (times.size() < 2) { return; }
74  std::ptrdiff_t longest_name = 0;
75  for (auto& name_and_time : times) {
76  longest_name = std::max(longest_name, (std::ptrdiff_t)name_and_time.first.size());
77  }
78 
79  for (auto prev = times.begin(), it = prev; it != times.end(); prev = it, ++it) {
80  printEntry(*it, *prev, os, longest_name);
81  if (std::next(it) != times.end()) {
82  os << '\n';
83  }
84  }
85  }
86 
87  void printEntry(const TimeEntry& entry, const TimeEntry& previous, std::ostream& os, std::ptrdiff_t name_width = 0) const {
88  os << std::setw(name_width) << entry.first
89  << " +" << std::fixed << differenceAsSecondFraction(previous.second, entry.second)
90  << " @" << std::fixed << differenceAsSecondFraction(times.front().second, entry.second);
91  }
92 
93  double getTotal() { return differenceAsSecondFraction(times.front().second, times.back().second); }
94  double secondsSinceStart() { return differenceAsSecondFraction(times.front().second, now()); }
95 
96  friend std::ostream& operator<<(std::ostream& os, const ChronoSequence& cs) {
97  cs.printTo(os); return os;
98  }
99 
100 protected:
104  void recordTick(TimeEntry new_entry, std::ostream* os) {
105  times.emplace_back(std::move(new_entry));
106  if (os) {
107  *os << "TICK: ";
108  printEntry(times.back(), *std::prev(std::prev(times.end())), *os);
109  *os << std::endl;
110  }
111  }
112 
113  std::string sequence_name;
114  std::vector<TimeEntry> times;
115 };
116 
122 
124  : ChronoSequence(std::move(sequence_name))
126  { }
127 
132 
134  if (not print_into_on_destruction) { return; }
135 
136  this->tick("end of " + sequence_name);
137  auto& os = *print_into_on_destruction;
138  try {
139  printTo(os);
140  os << '\n';
141  } catch (...) {
142  tryToSafelyPrintExceptionInfo(std::current_exception(), os, "printing PrintOnDestructionChronoSequence in it's destructor");
143  }
144  }
145 
146 private:
148 };
149 
150 #endif /* __UTILITY_TIMING_H__ */
PrintOnDestructionChronoSequence::PrintOnDestructionChronoSequence
PrintOnDestructionChronoSequence(std::string sequence_name, std::ostream *print_into_on_destruction)
Definition: CodeProfiling.h:123
ChronoSequence::~ChronoSequence
virtual ~ChronoSequence()=default
ChronoSequence::Clock
std::chrono::steady_clock Clock
Definition: CodeProfiling.h:27
ChronoSequence::TickResult
Definition: CodeProfiling.h:31
ChronoSequence::recordTick
void recordTick(TimeEntry new_entry, std::ostream *os)
Definition: CodeProfiling.h:104
PrintOnDestructionChronoSequence::print_into_on_destruction
std::ostream * print_into_on_destruction
Definition: CodeProfiling.h:147
ChronoSequence::differenceAsSecondFraction
static double differenceAsSecondFraction(const TimePoint &start, const TimePoint &end)
Definition: CodeProfiling.h:68
ChronoSequence::secondsSinceStart
double secondsSinceStart()
Definition: CodeProfiling.h:94
ChronoSequence::TimeEntry
std::pair< std::string, TimePoint > TimeEntry
Definition: CodeProfiling.h:29
tryToSafelyPrintExceptionInfo
void tryToSafelyPrintExceptionInfo(std::exception_ptr eptr, std::ostream &os, const char *action_name) noexcept
Definition: Exception.h:107
Exception.h
ChronoSequence::TickResult::seconds_since_last
double seconds_since_last
Definition: CodeProfiling.h:33
ChronoSequence::TickResult::recorded
bool recorded
Definition: CodeProfiling.h:32
ChronoSequence::printTo
void printTo(std::ostream &os) const
Definition: CodeProfiling.h:72
ChronoSequence::ChronoSequence
ChronoSequence(std::string sequence_name)
Definition: CodeProfiling.h:37
ChronoSequence::makeNowTick
TimeEntry makeNowTick(std::string timepoint_name) const
Definition: CodeProfiling.h:47
ChronoSequence::operator<<
friend std::ostream & operator<<(std::ostream &os, const ChronoSequence &cs)
Definition: CodeProfiling.h:96
ChronoSequence::now
auto now() const
Definition: CodeProfiling.h:46
PrintOnDestructionChronoSequence
Definition: CodeProfiling.h:121
ChronoSequence::tick
TickResult tick(std::string timepoint_name, double threshold=0.0, std::ostream *os=nullptr)
Definition: CodeProfiling.h:54
ChronoSequence::times
std::vector< TimeEntry > times
Definition: CodeProfiling.h:114
PrintOnDestructionChronoSequence::operator=
PrintOnDestructionChronoSequence & operator=(const PrintOnDestructionChronoSequence &)=default
end
auto end(const SingleItemImmutableSet< VertexID > &siis)
Definition: Collections.h:138
ChronoSequence::sequence_name
std::string sequence_name
Definition: CodeProfiling.h:113
ChronoSequence::TickResult::seconds_to_here
double seconds_to_here
Definition: CodeProfiling.h:34
PrintOnDestructionChronoSequence::~PrintOnDestructionChronoSequence
~PrintOnDestructionChronoSequence() override
Definition: CodeProfiling.h:133
ChronoSequence::TimePoint
std::chrono::time_point< Clock > TimePoint
Definition: CodeProfiling.h:28
ChronoSequence::getTotal
double getTotal()
Definition: CodeProfiling.h:93
ChronoSequence::printEntry
void printEntry(const TimeEntry &entry, const TimeEntry &previous, std::ostream &os, std::ptrdiff_t name_width=0) const
Definition: CodeProfiling.h:87
ChronoSequence
Definition: CodeProfiling.h:26