#pragma once #define TIMING_START(_name) \ struct { \ struct entry { \ std::string name; \ std::chrono::system_clock::time_point ts; \ }; \ \ std::string name; \ std::chrono::system_clock::time_point begin; \ std::chrono::system_clock::time_point end; \ std::deque timings; \ } _name ##_timings; \ _name ##_timings.begin = std::chrono::system_clock::now(); \ #define TIMING_STEP(name, step) \ name ##_timings.timings.push_back({step, std::chrono::system_clock::now()}); #define TIMING_FINISH(_name) \ ([&](){ \ _name ##_timings.end = std::chrono::system_clock::now(); \ std::string result; \ result = "timings for " + _name ##_timings.name + ": "; \ result += std::to_string(std::chrono::duration_cast(_name ##_timings.end - _name ##_timings.begin).count()) + "ms"; \ \ auto tp = _name ##_timings.begin; \ for(const auto& entry : _name ##_timings.timings) { \ result += "\n "; \ result += "- " + entry.name + ": "; \ result += "@" + std::to_string(std::chrono::duration_cast(entry.ts - _name ##_timings.begin).count()) + "ms"; \ result += ": " + std::to_string(std::chrono::duration_cast(entry.ts - tp).count()) + "ms"; \ tp = entry.ts; \ } \ return result; \ })()