forked from psi46/psi46test
-
Notifications
You must be signed in to change notification settings - Fork 0
/
profiler.h
52 lines (40 loc) · 1.04 KB
/
profiler.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// profiler.h
#pragma once
#include <string>
#include <list>
#include "config.h"
// MSVC: __FUNCTION__ __FUNCDNAME__ __FUNCSIG__
// GCC: __func__ __FUNCTION__ __PRETT_FUNCTION__
#ifdef ENABLE_PROFILING
#define PROFILING static Watchpoint profiler_watchpoint(__FUNCTION__); AutoCounter profiler_counter(profiler_watchpoint);
#else
#define PROFILING
#endif
#ifdef _WIN32
class Watchpoint
{
static long long frequency;
static std::list<Watchpoint*> wplist;
std::string name;
unsigned int n;
long long t;
bool IsRunning() { return wplist.size() != 0; }
void Incr(long long dt) { t += dt; n++; }
static void Report(const char *filename);
public:
Watchpoint(const char *fname);
~Watchpoint();
bool operator<(Watchpoint &wp) { return wp.name < name; }
friend class AutoCounter;
};
class AutoCounter
{
Watchpoint *m_wp;
long long m_start;
void Start() { m_start = __rdtsc(); }
void Stop() { m_wp->Incr(__rdtsc() - m_start); }
public:
AutoCounter(Watchpoint &handle) : m_wp(&handle) { Start(); }
~AutoCounter() { Stop(); }
};
#endif