Deterministic Gaussian Sampling
Loading...
Searching...
No Matches
capture_time.h
1#ifndef CAPTURE_TIME_H
2#define CAPTURE_TIME_H
3
4#include <algorithm>
5#include <chrono>
6#include <iostream>
7#include <map>
8#include <numeric>
9#include <string>
10#include <vector>
11
13 private:
14 // Struct to store time data for each named timer
15 struct TimerData {
16 std::chrono::high_resolution_clock::time_point startTime;
17 std::vector<std::chrono::nanoseconds> recordedTimes;
18 };
19
20 // Static map to store multiple timers by name
21 static std::map<std::string, TimerData> timers;
22
23 // Instance-specific variables for RAII-based timer
24 std::string instanceName;
25 std::chrono::high_resolution_clock::time_point instanceStartTime;
26 bool instanceActive;
27
28 public:
29 // Constructor (RAII-based timer that prints on destruction)
30 explicit CaptureTime(const std::string& name)
31 : instanceName(name),
32 instanceStartTime(std::chrono::high_resolution_clock::now()),
33 instanceActive(true) {}
34
35 // Destructor (prints elapsed time)
36 ~CaptureTime() {
37 if (instanceActive) {
38 auto endTime = std::chrono::high_resolution_clock::now();
39 auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(
40 endTime - instanceStartTime);
41 std::cout << "[" << instanceName
42 << "] Elapsed time: " << formatTime(elapsed) << "\n";
43 }
44 }
45
46 // Start a named static timer
47 static void start(const std::string& name) {
48 timers[name].startTime = std::chrono::high_resolution_clock::now();
49 }
50
51 // Stop a named static timer and record elapsed time
52 static void stop(const std::string& name) {
53 auto endTime = std::chrono::high_resolution_clock::now();
54 timers[name].recordedTimes.push_back(
55 std::chrono::duration_cast<std::chrono::nanoseconds>(
56 endTime - timers[name].startTime));
57 }
58
59 // Print statistics for a specific named timer
60 static void printStatistics(const std::string& name) {
61 if (timers.find(name) == timers.end() ||
62 timers[name].recordedTimes.empty()) {
63 std::cout << "[" << name << "] No data recorded.\n";
64 return;
65 }
66
67 std::vector<std::chrono::nanoseconds> sortedTimes =
68 timers[name].recordedTimes;
69 std::sort(sortedTimes.begin(), sortedTimes.end());
70
71 auto minTime = sortedTimes.front();
72 auto maxTime = sortedTimes.back();
73 auto medianTime = sortedTimes[sortedTimes.size() / 2];
74 auto avgTime = std::accumulate(sortedTimes.begin(), sortedTimes.end(),
75 std::chrono::nanoseconds(0)) /
76 sortedTimes.size();
77
78 std::cout << "[" << name << "] Statistics:\n"
79 << " Min: " << formatTime(minTime) << "\n"
80 << " Max: " << formatTime(maxTime) << "\n"
81 << " Median: " << formatTime(medianTime) << "\n"
82 << " Average: " << formatTime(avgTime) << "\n";
83 }
84
85 // Print statistics for all named timers
86 static void printAllStatistics() {
87 for (const auto& [name, _] : timers) {
88 printStatistics(name);
89 }
90 }
91
92 private:
93 // Convert nanoseconds to a readable format
94 static std::string formatTime(std::chrono::nanoseconds ns) {
95 auto sec = std::chrono::duration_cast<std::chrono::seconds>(ns).count();
96 auto ms =
97 std::chrono::duration_cast<std::chrono::milliseconds>(ns).count() %
98 1000;
99 auto us =
100 std::chrono::duration_cast<std::chrono::microseconds>(ns).count() %
101 1000;
102 auto ns_only = ns.count() % 1000;
103
104 return "<" + std::to_string(sec) + "s-" + std::to_string(ms) + "ms-" +
105 std::to_string(us) + "us-" + std::to_string(ns_only) + "ns>";
106 }
107};
108
109#endif
Definition capture_time.h:12