Created
November 21, 2022 00:54
-
-
Save meftunca/5948ec1a559ea14ae60c31549ed2cded to your computer and use it in GitHub Desktop.
C++ Performance Logger like browser console.time/End
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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