28 : m_CurrentSession(
nullptr)
33 void BeginSession(
const std::string& name,
const std::string& filepath =
"results.json")
35 m_OutputStream.open(filepath);
43 m_OutputStream.close();
44 delete m_CurrentSession;
45 m_CurrentSession =
nullptr;
51 if (m_ProfileCount++ > 0)
52 m_OutputStream <<
",";
54 std::string name = result.Name;
55 std::replace(name.begin(), name.end(),
'"',
'\'');
57 m_OutputStream <<
"{";
58 m_OutputStream <<
"\"cat\":\"function\",";
59 m_OutputStream <<
"\"dur\":" << (result.End - result.Start) <<
',';
60 m_OutputStream <<
"\"name\":\"" << name <<
"\",";
61 m_OutputStream <<
"\"ph\":\"X\",";
62 m_OutputStream <<
"\"pid\":0,";
63 m_OutputStream <<
"\"tid\":" << result.ThreadID <<
",";
64 m_OutputStream <<
"\"ts\":" << result.Start;
65 m_OutputStream <<
"}";
67 m_OutputStream.flush();
72 m_OutputStream <<
"{\"otherData\": {},\"traceEvents\":[";
73 m_OutputStream.flush();
78 m_OutputStream <<
"]}";
79 m_OutputStream.flush();
82 static Instrumentor& Get()
84 static Instrumentor instance;
90 std::ofstream m_OutputStream;
94 class InstrumentationTimer
97 InstrumentationTimer(
const char* name)
101 m_StartTimepoint = std::chrono::high_resolution_clock::now();
104 ~InstrumentationTimer()
112 auto endTimepoint = std::chrono::high_resolution_clock::now();
114 long long start = std::chrono::time_point_cast<std::chrono::microseconds>(m_StartTimepoint).time_since_epoch().count();
115 long long end = std::chrono::time_point_cast<std::chrono::microseconds>(endTimepoint).time_since_epoch().count();
117 size_t threadID = std::hash<std::thread::id>{}(std::this_thread::get_id());
118 Instrumentor::Get().WriteProfile({ m_Name, start, end, threadID });
124 std::chrono::time_point<std::chrono::high_resolution_clock> m_StartTimepoint;