Skip to content

Instantly share code, notes, and snippets.

@meftunca
Created November 21, 2022 00:54
Show Gist options
  • Save meftunca/5948ec1a559ea14ae60c31549ed2cded to your computer and use it in GitHub Desktop.
Save meftunca/5948ec1a559ea14ae60c31549ed2cded to your computer and use it in GitHub Desktop.
C++ Performance Logger like browser console.time/End
#include <chrono>
#include <map>
struct PerformanceTracker {
std::chrono::steady_clock::time_point start;
std::chrono::steady_clock::time_point end;
};
class PerformanceLogger {
public:
PerformanceLogger();
inline PerformanceLogger(PerformanceLogger &&other) noexcept;
inline PerformanceLogger &operator=(PerformanceLogger &&other) noexcept;
inline explicit PerformanceLogger(const PerformanceLogger &other) noexcept =
default;
inline PerformanceLogger &
operator=(const PerformanceLogger &other) noexcept = default;
// PerformanceLogger(const PerformanceLogger&) = delete;
// PerformanceLogger& operator=(const PerformanceLogger&) = delete;
// destructor
~PerformanceLogger() { actionMap.clear(); }
// PerformanceLogger(const PerformanceLogger&) = delete;
inline void time(const std::string &workName) noexcept {
if (!actionMap.contains(workName)) {
actionMap[workName] = std::vector<PerformanceTracker>();
}
PerformanceTracker tracker;
tracker.start = std::chrono::steady_clock::now();
tracker.end = tracker.start;
actionMap[workName].push_back(tracker);
}
inline void timeEnd(const std::string &workName) noexcept {
PerformanceTracker tracker = actionMap[workName].back();
tracker.end = std::chrono::steady_clock::now();
actionMap[workName].back() = tracker;
}
inline void prettyPrint() noexcept {
std::map<std::string, int> generalMap;
int generalTime = 0;
for (auto &[key, value] : actionMap) {
int sumTotalTime = 0;
for (auto &tracker : value) {
auto totalTime = std::chrono::duration_cast<std::chrono::nanoseconds>(
tracker.end - tracker.start)
.count();
sumTotalTime += static_cast<int>(totalTime);
}
generalMap[key] = sumTotalTime;
generalTime += sumTotalTime;
}
std::cout << "{" << std::endl;
std::cout << "'General Time': " << generalTime << "," << std::endl;
for (auto &[key, value] : generalMap) {
double percentage = value / (static_cast<double>(generalTime)) * 100;
std::cout << "'" << key << "': '" << value << "ns, %" << percentage
<< ", Call Count: " << actionMap[key].size() << "',"
<< std::endl;
}
std::cout << "}" << std::endl;
}
private:
std::map<std::string, std::vector<PerformanceTracker>> actionMap;
};
inline PerformanceLogger::PerformanceLogger() {
actionMap = std::map<std::string, std::vector<PerformanceTracker>>();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment