| @@ -4,13 +4,21 @@ | |||||
| # include <stdio.h> | # include <stdio.h> | ||||
| # include <string.h> | # include <string.h> | ||||
| # include <time.h> | # include <time.h> | ||||
| // # include <bits/stdc++.h> | |||||
| // # include <iostream> | |||||
| // # include <sys/stat.h> | |||||
| // # include <sys/types.h> | |||||
| #ifdef _MSC_VER | |||||
| // if windows | |||||
| # include <Windows.h> | |||||
| #else | |||||
| # include <sys/time.h> | |||||
| #endif | |||||
| //# include <bits/stdc++.h> | |||||
| # include <iostream> | |||||
| # include <sys/stat.h> | |||||
| # include <sys/types.h> | |||||
| struct Profiler { | struct Profiler { | ||||
| LARGE_INTEGER tmp_time; | |||||
| // same for all threads | // same for all threads | ||||
| inline static char file_template[40] = "\0"; | inline static char file_template[40] = "\0"; | ||||
| @@ -19,7 +27,9 @@ struct Profiler { | |||||
| inline thread_local static size_t thread_id = -1; | inline thread_local static size_t thread_id = -1; | ||||
| inline thread_local static int call_depth = 0; | inline thread_local static int call_depth = 0; | ||||
| inline thread_local static FILE* out_file = nullptr; | inline thread_local static FILE* out_file = nullptr; | ||||
| Profiler(const char* file, const char* func, const int line) { | |||||
| Profiler(const char* file, const char* func, const int line, char* custom_name) { | |||||
| call_depth += 1; | call_depth += 1; | ||||
| // if we never used this thread before | // if we never used this thread before | ||||
| @@ -53,18 +63,25 @@ struct Profiler { | |||||
| is_initialized = true; | is_initialized = true; | ||||
| } | } | ||||
| fprintf(out_file, "-> %s %s %d\n", func, file, line); | |||||
| QueryPerformanceCounter(&tmp_time); | |||||
| fprintf(out_file, "->,%lld,%s,%s,%d\n", | |||||
| tmp_time.QuadPart, | |||||
| (custom_name ? | |||||
| custom_name : | |||||
| func), file, line); | |||||
| }; | }; | ||||
| ~Profiler() { | ~Profiler() { | ||||
| call_depth -= 1; | call_depth -= 1; | ||||
| fprintf(out_file, "<-\n"); | |||||
| QueryPerformanceCounter(&tmp_time); | |||||
| fprintf(out_file, "<-,%lld,,,\n", tmp_time.QuadPart); | |||||
| if (call_depth == 0) | if (call_depth == 0) | ||||
| fflush(out_file); | fflush(out_file); | ||||
| }; | }; | ||||
| }; | }; | ||||
| # define profile_this Profiler profiler(__FILE__, __FUNCTION__, __LINE__) | |||||
| # define profile_this() Profiler profiler(__FILE__, __FUNCTION__, __LINE__, 0) | |||||
| # define profile_with_name(name) Profiler profiler(__FILE__, __FUNCTION__, __LINE__, name) | |||||
| #else | #else | ||||
| # define profile_this do {} while(0) | |||||
| # define profile_this() do {} while(0) | |||||
| # define profile_with_name() do {} while(0) | |||||
| #endif | #endif | ||||