mlisp/ml_profiler.h

55 lines
1.3 KiB
C++

#pragma once
#include "ml.h"
#include <unordered_map>
#include <deque>
#include <chrono>
#include <thread>
#include <mutex>
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();
bool isDebugOn() { return debugStacktraceOn; }
void add_method_call(const MlValue &function, const std::vector<MlValue> &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<std::string, long> calls_counter;
std::chrono::time_point<std::chrono::high_resolution_clock> start_time;
std::deque<std::string> call_stack;
std::thread::id main_thread_id;
};