#pragma once #include "ml.h" #include #include #include #include #include static const int method_name_print_len = 15; static const int print_top_methods = 15; static const int call_stack_max_methods = 10; static const int call_stack_args_str_len = 64; class MlPerfMon { private: MlPerfMon() : perfOn(false), debugStacktraceOn(false) { main_thread_id = std::this_thread::get_id(); }; public: // https://stackoverflow.com/questions/43523509/simple-singleton-example-in-c static MlPerfMon& instance() { static MlPerfMon instance; return instance; } void turnOn(); void debugOn(); void add_method_call(const MlValue &function, const std::vector &args); void end_method_call(); std::string callstack() const; size_t get_callstack_position() const; void restore_callstack_position(size_t to_position); void clear_callstack(); void print_results() const; private: bool perfOn; bool debugStacktraceOn; std::unordered_map calls_counter; std::chrono::time_point start_time; std::deque call_stack; std::thread::id main_thread_id; };