From 5d6da78c90968738bcbf247530b3a3d0f095888b Mon Sep 17 00:00:00 2001 From: Felix Brendel Date: Sat, 24 Aug 2019 18:47:47 +0200 Subject: [PATCH] profiler added --- .gitignore | 1 + build.bat | 29 +++++++++++++++++++++++++++++ macros.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ profiler.h | 40 ++++++++++++++++++++++++++++++++++++++++ test.cpp | 21 +++++++++++++++++++++ types.h | 16 ++++++++++++++++ 6 files changed, 161 insertions(+) create mode 100644 .gitignore create mode 100644 build.bat create mode 100644 macros.h create mode 100644 profiler.h create mode 100644 test.cpp create mode 100644 types.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5b450d4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/bin/* diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..6bf3653 --- /dev/null +++ b/build.bat @@ -0,0 +1,29 @@ +@echo off +pushd %~dp0 + +set exeName=main.exe +set binDir=bin + +mkdir %bindir% +pushd %bindir% + +cl^ + ../test.cpp^ + /Fe%exeName% /MP /openmp /W3 /std:c++latest^ + /nologo /EHsc /Z7^ + /link /incremental /debug:fastlink + +if %errorlevel% == 0 ( + echo. + if not exist ..\%binDir% mkdir ..\%binDir% + move %exeName% ..\%binDir%\ > NUL + echo ---------- Output start ---------- + %exeName% + echo ---------- Output end ---------- + popd +) else ( + echo. + echo Fucki'n 'ell +) + +popd diff --git a/macros.h b/macros.h new file mode 100644 index 0000000..fb147f8 --- /dev/null +++ b/macros.h @@ -0,0 +1,54 @@ +#pragma once +#include + +#define proc auto + +#ifdef _DEBUG +# define if_debug if constexpr (true) +#else +# define if_debug if constexpr (false) +#endif + +#ifdef _MSC_VER +# define debug_break() if_debug __debugbreak() +# define if_windows if constexpr (true) +# define if_linux if constexpr (false) +#else +# define debug_break() if_debug raise(SIGTRAP) +# define if_windows if constexpr (false) +# define if_linux if constexpr (true) +#endif + +/** + * Defer * +*/ + +template +class defer_finalizer { + F f; + bool moved; +public: + template + defer_finalizer(T && f_) : f(std::forward(f_)), moved(false) { } + + defer_finalizer(const defer_finalizer &) = delete; + + defer_finalizer(defer_finalizer && other) : f(std::move(other.f)), moved(other.moved) { + other.moved = true; + } + + ~defer_finalizer() { + if (!moved) f(); + } +}; + +struct { + template + defer_finalizer operator<<(F && f) { + return defer_finalizer(std::forward(f)); + } +} deferrer; + +#define TOKENPASTE(x, y) x ## y +#define TOKENPASTE2(x, y) TOKENPASTE(x, y) +#define defer auto TOKENPASTE2(__deferred_lambda_call, __COUNTER__) = deferrer << [&] diff --git a/profiler.h b/profiler.h new file mode 100644 index 0000000..2f29085 --- /dev/null +++ b/profiler.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include + +struct Profiler { + inline thread_local static int thread_id = 0; + inline thread_local static FILE* out_file = nullptr; + inline static char file_template[40] = "\0"; + + Profiler(const char* file, const char* func, const int line) { + if (!out_file) { + time_t t = time(NULL); + tm tm_i; + localtime_s(&tm_i, &t); + + if (!file_template[0]) { + sprintf(file_template, "%02d.%02d.%04d-%02d.%02d.%02d-%%02d-profiler.report", + tm_i.tm_mday, tm_i.tm_mon+1, tm_i.tm_year+1900, + tm_i.tm_hour, tm_i.tm_min, tm_i.tm_sec); + } + + char file_name[38]; + sprintf(file_name, file_template, thread_id); + fopen_s(&out_file, file_name, "w"); + if (!out_file) { + printf("could not open %s\n", file_name); + } + + } + + fprintf(out_file, "-> %s %s %d\n", func, file, line); + }; + ~Profiler() { + fprintf(out_file, "<-\n"); + }; +}; + +#define profile_this Profiler profiler(__FILE__, __FUNCTION__, __LINE__) diff --git a/test.cpp b/test.cpp new file mode 100644 index 0000000..3e18e21 --- /dev/null +++ b/test.cpp @@ -0,0 +1,21 @@ +#define _CRT_SECURE_NO_WARNINGS +#include + +#include "profiler.h" +#include "macros.h" + +void test() { + profile_this; + + printf("doing more work!\n"); +} + +int main(int argc, char* argv[]) { + profile_this; + + printf("doing some work and sleeping!\n"); + Sleep(1000); // Sleep a seconds + test(); + + return 0; +} diff --git a/types.h b/types.h new file mode 100644 index 0000000..dd30bd0 --- /dev/null +++ b/types.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +typedef float f32; +typedef long double f64;