Graph Framework
Loading...
Searching...
No Matches
timing.hpp
Go to the documentation of this file.
1//------------------------------------------------------------------------------
4//------------------------------------------------------------------------------
5
6#ifndef timing_h
7#define timing_h
8
9#include <chrono>
10#include <mutex>
11#include <map>
12
14namespace timing {
15//------------------------------------------------------------------------------
17//------------------------------------------------------------------------------
19 private:
21 const std::string label;
23 std::chrono::high_resolution_clock::time_point start;
24
25 public:
26//------------------------------------------------------------------------------
30//------------------------------------------------------------------------------
31 measure_diagnostic(const std::string message = "") :
32 label(message), start(std::chrono::high_resolution_clock::now()) {}
33
34//------------------------------------------------------------------------------
38//------------------------------------------------------------------------------
40 label(md.label), start(md.start) {}
41
42//------------------------------------------------------------------------------
44//------------------------------------------------------------------------------
45 void reset() {
46 start = std::chrono::high_resolution_clock::now();
47 }
48
49//------------------------------------------------------------------------------
51//------------------------------------------------------------------------------
52 void print() const {
53 const auto end = std::chrono::high_resolution_clock::now();
54 const auto total_time = end - start;
55 const std::chrono::nanoseconds total_time_ns =
56 std::chrono::duration_cast<std::chrono::nanoseconds> (total_time);
57
58 std::cout << std::endl << " " << label << " : ";
59
60 if (total_time_ns.count() < 1000) {
61 std::cout << total_time_ns.count() << " ns" << std::endl;
62 } else if (total_time_ns.count() < 1000000) {
63 std::cout << total_time_ns.count()/1000.0 << " μs" << std::endl;
64 } else if (total_time_ns.count() < 1000000000) {
65 std::cout << total_time_ns.count()/1000000.0 << " ms" << std::endl;
66 } else if (total_time_ns.count() < 60000000000) {
67 std::cout << total_time_ns.count()/1000000000.0 << " s" << std::endl;
68 } else if (total_time_ns.count() < 3600000000000) {
69 std::cout << total_time_ns.count()/60000000000.0 << " min" << std::endl;
70 } else {
71 std::cout << total_time_ns.count()/3600000000000.0 << " h" << std::endl;
72 }
73 std::cout << std::endl;
74 }
75 };
76
77//------------------------------------------------------------------------------
79//------------------------------------------------------------------------------
81 private:
83 const std::string label;
85 std::map<size_t, std::chrono::high_resolution_clock::time_point> start;
87 std::map<size_t, std::chrono::high_resolution_clock::time_point> end;
89 std::mutex sync_start;
91 std::mutex sync_end;
92
93 public:
94//------------------------------------------------------------------------------
98//------------------------------------------------------------------------------
99 measure_diagnostic_threaded(const std::string message = "") :
100 label(message) {}
101
102//------------------------------------------------------------------------------
106//------------------------------------------------------------------------------
108 label(mdt.label) {}
109
110//------------------------------------------------------------------------------
114//------------------------------------------------------------------------------
115 void start_time(const size_t thread_number) {
116 sync_start.lock();
117 start[thread_number] = std::chrono::high_resolution_clock::now();
118 sync_start.unlock();
119 }
120
121//------------------------------------------------------------------------------
125//------------------------------------------------------------------------------
126 void end_time(const size_t thread_number) {
127 const auto temp = std::chrono::high_resolution_clock::now();
128 sync_end.lock();
129 end[thread_number] = temp;
130 sync_end.unlock();
131 }
132
133//------------------------------------------------------------------------------
135//------------------------------------------------------------------------------
136 void print() {
137 std::chrono::nanoseconds total_time_ns = static_cast<std::chrono::nanoseconds> (0);
138 for (size_t i = 0, ie = start.size(); i < ie; i++) {
139 const auto duration = end[i] - start[i];
140 total_time_ns += std::chrono::duration_cast<std::chrono::nanoseconds> (duration);
141 }
142
143 std::cout << "Average " << label << " time : " << total_time_ns.count()/start.size() << " ns"<< std::endl;
144 }
145
146//------------------------------------------------------------------------------
148//------------------------------------------------------------------------------
149 void print_max() {
150 std::chrono::nanoseconds total_time_ns = static_cast<std::chrono::nanoseconds> (0);
151 for (size_t i = 0, ie = start.size(); i < ie; i++) {
152 const auto duration = end[i] - start[i];
153 total_time_ns = std::max(std::chrono::duration_cast<std::chrono::nanoseconds> (duration), total_time_ns);
154 }
155
156 std::cout << "Max " << label << " time : ";
157 if (total_time_ns.count() < 1000) {
158 std::cout << total_time_ns.count() << " ns" << std::endl;
159 } else if (total_time_ns.count() < 1000000) {
160 std::cout << total_time_ns.count()/1000.0 << " μs" << std::endl;
161 } else if (total_time_ns.count() < 1000000000) {
162 std::cout << total_time_ns.count()/1000000.0 << " ms" << std::endl;
163 } else if (total_time_ns.count() < 60000000000) {
164 std::cout << total_time_ns.count()/1000000000.0 << " s" << std::endl;
165 } else if (total_time_ns.count() < 3600000000000) {
166 std::cout << total_time_ns.count()/60000000000.0 << " min" << std::endl;
167 } else {
168 std::cout << total_time_ns.count()/3600000000000.0 << " h" << std::endl;
169 }
170 std::cout << std::endl;
171 }
172 };
173}
174
175#endif /* timing_h */
A timing object that averages over multiple threads.
Definition timing.hpp:80
measure_diagnostic_threaded(const measure_diagnostic_threaded &mdt)
Construct a time diagnostic object.
Definition timing.hpp:107
void start_time(const size_t thread_number)
Start time for a given thread.
Definition timing.hpp:115
void print()
Print out the average time.
Definition timing.hpp:136
void print_max()
Print out the max time.
Definition timing.hpp:149
measure_diagnostic_threaded(const std::string message="")
Construct a time diagnostic object.
Definition timing.hpp:99
void end_time(const size_t thread_number)
End time for a given thread.
Definition timing.hpp:126
A timing object.
Definition timing.hpp:18
measure_diagnostic(const measure_diagnostic &md)
Construct a time diagnostic object.
Definition timing.hpp:39
measure_diagnostic(const std::string message="")
Construct a time diagnostic object.
Definition timing.hpp:31
void reset()
Reset the time.
Definition timing.hpp:45
void print() const
Print the result.
Definition timing.hpp:52
Name space for timers.
Definition timing.hpp:14