45static const char* defaultTracerFileName(
"default_MNETracer_file.json");
46bool MNETracer::ms_bIsEnabled(
false);
47std::ofstream MNETracer::ms_OutputFileStream;
48bool MNETracer::ms_bIsFirstEvent(
true);
49std::mutex MNETracer::ms_outFileMutex;
50long long MNETracer::ms_iZeroTime(0);
57: m_bIsInitialized(false)
58, m_bPrintToTerminal(false)
60, m_sFunctionName(function)
61, m_iLineNumber(lineNumber)
78 if (ms_bIsEnabled && m_bIsInitialized)
82 if (m_bPrintToTerminal)
85 printDurationMiliSec();
94 ms_OutputFileStream.open(jsonFileName);
97 if (ms_OutputFileStream.is_open())
107 enable(defaultTracerFileName);
117 ms_OutputFileStream.flush();
118 ms_OutputFileStream.close();
119 ms_bIsEnabled =
false;
148 long long timeNow = getTimeNow() - ms_iZeroTime;
150 s.append(
"{\"name\":\"").append(name).append(
"\",\"ph\":\"C\",\"ts\":");
151 s.append(std::to_string(timeNow)).append(
",\"pid\":1,\"tid\":1");
152 s.append(
",\"args\":{\"").append(name).append(
"\":").append(std::to_string(val)).append(
"}}\n");
158void MNETracer::initialize()
160 registerConstructionTime();
163 m_bIsInitialized =
true;
168void MNETracer::setZeroTime()
170 ms_iZeroTime = getTimeNow();
175void MNETracer::registerConstructionTime()
177 m_iBeginTime = getTimeNow() - ms_iZeroTime;
182void MNETracer::registerFinalTime()
184 m_iEndTime = getTimeNow() - ms_iZeroTime;
189long long MNETracer::getTimeNow()
191 auto timeNow = std::chrono::high_resolution_clock::now();
192 return std::chrono::time_point_cast<std::chrono::microseconds>(timeNow).time_since_epoch().count();
197void MNETracer::registerThreadId()
199 auto longId = std::hash<std::thread::id>{}(std::this_thread::get_id());
200 m_iThreadId = std::to_string(longId).substr(0, 5);
205void MNETracer::formatFunctionName()
207 const char* pattern(
" __cdecl");
208 constexpr int patternLenght(8);
209 size_t pos = m_sFunctionName.find(pattern);
210 if (pos != std::string::npos) {
211 m_sFunctionName.replace(pos, patternLenght,
"");
217void MNETracer::formatFileName()
219 const char* patternIn(
"\\");
220 const char* patternOut(
"\\\\");
221 constexpr int patternOutLength(4);
222 size_t start_pos = 0;
223 while ((start_pos = m_sFileName.find(patternIn, start_pos)) != std::string::npos)
225 m_sFileName.replace(start_pos, 1, patternOut);
226 start_pos += patternOutLength;
232void MNETracer::calculateDuration()
234 m_dDurationMilis = (m_iEndTime - m_iBeginTime) * 0.001;
239void MNETracer::printDurationMiliSec()
241 std::cout <<
"Scope: " << m_sFileName <<
" - " << m_sFunctionName <<
" DurationMs: " << m_dDurationMilis <<
"ms.\n";
246void MNETracer::writeHeader()
248 writeToFile(
"{\"displayTimeUnit\": \"ms\",\"traceEvents\":[\n");
253void MNETracer::writeFooter()
260void MNETracer::writeToFile(
const std::string& str)
262 ms_outFileMutex.lock();
263 if(ms_OutputFileStream.is_open()) {
264 ms_OutputFileStream << str;
266 ms_outFileMutex.unlock();
271void MNETracer::writeBeginEvent()
274 if (!ms_bIsFirstEvent)
277 s.append(
"{\"name\":\"").append(m_sFunctionName).append(
"\",\"cat\":\"bst\",");
278 s.append(
"\"ph\":\"B\",\"ts\":").append(std::to_string(m_iBeginTime)).append(
",\"pid\":1,\"tid\":");
279 s.append(m_iThreadId).append(
",\"args\":{\"file path\":\"").append(m_sFileName).append(
"\",\"line number\":");
280 s.append(std::to_string(m_iLineNumber)).append(
"}}\n");
282 ms_bIsFirstEvent =
false;
287void MNETracer::writeEndEvent()
290 s.append(
",{\"name\":\"").append(m_sFunctionName).append(
"\",\"cat\":\"bst\",");
291 s.append(
"\"ph\":\"E\",\"ts\":").append(std::to_string(m_iEndTime)).append(
",\"pid\":1,\"tid\":");
292 s.append(m_iThreadId).append(
",\"args\":{\"file path\":\"").append(m_sFileName).append(
"\",\"line number\":");
293 s.append(std::to_string(m_iLineNumber)).append(
"}}\n");
301 return m_bPrintToTerminal;
308 m_bPrintToTerminal = s;
Declaration of a MNETracer object. This class allows a user to easily measure executions times of a f...
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
bool printToTerminalIsSet()
static void stop()
Convenience overload of the method disable.
static void disable()
disable If the class "is enabled" (it's static variabable ms_bIsEnabled is true), the output file has...
static void start()
Convenience overload of the method enable.
MNETracer(const std::string &file, const std::string &function, int lineNumber)
MNETracer constructor will check if the class "is enabled". If it is, it will record the creation tim...
static void traceQuantity(const std::string &name, long val)
traceQuantity Allows to keep track of a specific variable in the output tracing file.
void setPrintToTerminal(bool s)