mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
81 lines
1.8 KiB
C++
81 lines
1.8 KiB
C++
class String;
|
|
|
|
#if defined(PLATFORM_POSIX) || defined(PLATFORM_WINCE)
|
|
inline int tmGetTime() {
|
|
return GetTickCount();
|
|
}
|
|
#else
|
|
inline int tmGetTime() {
|
|
return timeGetTime();
|
|
}
|
|
#endif
|
|
|
|
class TimingInspector {
|
|
protected:
|
|
static bool active;
|
|
|
|
const char *name;
|
|
int call_count;
|
|
dword total_time;
|
|
dword min_time;
|
|
dword max_time;
|
|
int max_nesting;
|
|
int all_count;
|
|
StaticMutex mutex;
|
|
|
|
public:
|
|
TimingInspector(const char *name = NULL); // Not String !!!
|
|
~TimingInspector();
|
|
|
|
void Add(dword time, int nesting);
|
|
|
|
String Dump();
|
|
|
|
class Routine {
|
|
public:
|
|
Routine(TimingInspector& stat, int& nesting)
|
|
: nesting(nesting), stat(stat) {
|
|
start_time = tmGetTime();
|
|
nesting++;
|
|
}
|
|
|
|
~Routine() {
|
|
nesting--;
|
|
stat.Add(start_time, nesting);
|
|
}
|
|
|
|
protected:
|
|
dword start_time;
|
|
int& nesting;
|
|
TimingInspector& stat;
|
|
};
|
|
|
|
static void Activate(bool b) { active = b; }
|
|
};
|
|
|
|
class HitCountInspector
|
|
{
|
|
public:
|
|
HitCountInspector(const char *name, int hitcount = 0) : name(name), hitcount(hitcount) {}
|
|
~HitCountInspector();
|
|
|
|
void Step() { hitcount++; }
|
|
void Add(int i) { hitcount += i; }
|
|
void operator ++ () { Step(); }
|
|
void operator += (int i) { Add(i); }
|
|
|
|
private:
|
|
const char *name;
|
|
int hitcount;
|
|
};
|
|
|
|
#define RTIMING(x) \
|
|
static UPP::TimingInspector COMBINE(sTmStat, __LINE__)(x); \
|
|
static thread_local int COMBINE(sTmStatNesting, __LINE__); \
|
|
UPP::TimingInspector::Routine COMBINE(sTmStatR, __LINE__)(COMBINE(sTmStat, __LINE__), COMBINE(sTmStatNesting, __LINE__))
|
|
|
|
#define RACTIVATE_TIMING() TimingInspector::Activate(true);
|
|
#define RDEACTIVATE_TIMING() TimingInspector::Activate(false);
|
|
|
|
#define RHITCOUNT(n) \
|
|
{ static HitCountInspector hitcount(n); hitcount.Step(); }
|