profiler added
This commit is contained in:
@@ -0,0 +1 @@
|
||||
/bin/*
|
||||
@@ -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
|
||||
@@ -0,0 +1,54 @@
|
||||
#pragma once
|
||||
#include <functional>
|
||||
|
||||
#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<typename F>
|
||||
class defer_finalizer {
|
||||
F f;
|
||||
bool moved;
|
||||
public:
|
||||
template<typename T>
|
||||
defer_finalizer(T && f_) : f(std::forward<T>(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<typename F>
|
||||
defer_finalizer<F> operator<<(F && f) {
|
||||
return defer_finalizer<F>(std::forward<F>(f));
|
||||
}
|
||||
} deferrer;
|
||||
|
||||
#define TOKENPASTE(x, y) x ## y
|
||||
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
|
||||
#define defer auto TOKENPASTE2(__deferred_lambda_call, __COUNTER__) = deferrer << [&]
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
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__)
|
||||
@@ -0,0 +1,21 @@
|
||||
#define _CRT_SECURE_NO_WARNINGS
|
||||
#include <windows.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user