Add varying levels of precision to TimeTaker
parent
5e7e0347cd
commit
df49b93877
|
@ -31,7 +31,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
Normal build: main.cpp
|
Normal build: main.cpp
|
||||||
Server build: servermain.cpp
|
Server build: servermain.cpp
|
||||||
*/
|
*/
|
||||||
|
enum TimePrecision {
|
||||||
|
PRECISION_SECONDS,
|
||||||
|
PRECISION_MILLI,
|
||||||
|
PRECISION_MICRO,
|
||||||
|
PRECISION_NANO
|
||||||
|
};
|
||||||
|
|
||||||
extern u32 getTimeMs();
|
extern u32 getTimeMs();
|
||||||
|
extern u32 getTime(TimePrecision prec);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Timestamp stuff
|
Timestamp stuff
|
||||||
|
|
29
src/main.cpp
29
src/main.cpp
|
@ -133,7 +133,12 @@ MainGameCallback *g_gamecallback = NULL;
|
||||||
u32 getTimeMs()
|
u32 getTimeMs()
|
||||||
{
|
{
|
||||||
/* Use imprecise system calls directly (from porting.h) */
|
/* Use imprecise system calls directly (from porting.h) */
|
||||||
return porting::getTimeMs();
|
return porting::getTime(PRECISION_MILLI);
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 getTime(TimePrecision prec)
|
||||||
|
{
|
||||||
|
return porting::getTime(prec);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -142,7 +147,7 @@ u32 getTimeMs()
|
||||||
class TimeGetter
|
class TimeGetter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual u32 getTime() = 0;
|
virtual u32 getTime(TimePrecision prec) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// A precise irrlicht one
|
// A precise irrlicht one
|
||||||
|
@ -152,11 +157,15 @@ public:
|
||||||
IrrlichtTimeGetter(IrrlichtDevice *device):
|
IrrlichtTimeGetter(IrrlichtDevice *device):
|
||||||
m_device(device)
|
m_device(device)
|
||||||
{}
|
{}
|
||||||
u32 getTime()
|
u32 getTime(TimePrecision prec)
|
||||||
{
|
{
|
||||||
|
if (prec == PRECISION_MILLI) {
|
||||||
if(m_device == NULL)
|
if(m_device == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
return m_device->getTimer()->getRealTime();
|
return m_device->getTimer()->getRealTime();
|
||||||
|
} else {
|
||||||
|
return porting::getTime(prec);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
IrrlichtDevice *m_device;
|
IrrlichtDevice *m_device;
|
||||||
|
@ -165,9 +174,9 @@ private:
|
||||||
class SimpleTimeGetter: public TimeGetter
|
class SimpleTimeGetter: public TimeGetter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
u32 getTime()
|
u32 getTime(TimePrecision prec)
|
||||||
{
|
{
|
||||||
return porting::getTimeMs();
|
return porting::getTime(prec);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -179,7 +188,13 @@ u32 getTimeMs()
|
||||||
{
|
{
|
||||||
if(g_timegetter == NULL)
|
if(g_timegetter == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
return g_timegetter->getTime();
|
return g_timegetter->getTime(PRECISION_MILLI);
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 getTime(TimePrecision prec) {
|
||||||
|
if (g_timegetter == NULL)
|
||||||
|
return 0;
|
||||||
|
return g_timegetter->getTime(prec);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -805,7 +820,7 @@ void SpeedTests()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Do at least 10ms
|
// Do at least 10ms
|
||||||
while(timer.getTime() < 10);
|
while(timer.getTimerTime() < 10);
|
||||||
|
|
||||||
u32 dtime = timer.stop();
|
u32 dtime = timer.stop();
|
||||||
u32 per_ms = n / dtime;
|
u32 per_ms = n / dtime;
|
||||||
|
|
|
@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "irrlichttypes.h" // u32
|
#include "irrlichttypes.h" // u32
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
|
#include "gettime.h"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define SWPRINTF_CHARSTRING L"%S"
|
#define SWPRINTF_CHARSTRING L"%S"
|
||||||
|
@ -153,18 +154,65 @@ bool threadSetPriority(threadid_t tid, int prio);
|
||||||
*/
|
*/
|
||||||
#ifdef _WIN32 // Windows
|
#ifdef _WIN32 // Windows
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
|
inline u32 getTimeS()
|
||||||
|
{
|
||||||
|
return GetTickCount() / 1000;
|
||||||
|
}
|
||||||
|
|
||||||
inline u32 getTimeMs()
|
inline u32 getTimeMs()
|
||||||
{
|
{
|
||||||
return GetTickCount();
|
return GetTickCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline u32 getTimeUs()
|
||||||
|
{
|
||||||
|
LARGE_INTEGER freq, t;
|
||||||
|
QueryPerformanceFrequency(&freq);
|
||||||
|
QueryPerformanceCounter(&t);
|
||||||
|
return (double)(t.QuadPart) / ((double)(freq.QuadPart) / 1000000.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline u32 getTimeNs()
|
||||||
|
{
|
||||||
|
LARGE_INTEGER freq, t;
|
||||||
|
QueryPerformanceFrequency(&freq);
|
||||||
|
QueryPerformanceCounter(&t);
|
||||||
|
return (double)(t.QuadPart) / ((double)(freq.QuadPart) / 1000000000.0);
|
||||||
|
}
|
||||||
|
|
||||||
#else // Posix
|
#else // Posix
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
inline u32 getTimeS()
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
return tv.tv_sec;
|
||||||
|
}
|
||||||
|
|
||||||
inline u32 getTimeMs()
|
inline u32 getTimeMs()
|
||||||
{
|
{
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
gettimeofday(&tv, NULL);
|
gettimeofday(&tv, NULL);
|
||||||
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline u32 getTimeUs()
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
return tv.tv_sec * 1000000 + tv.tv_usec;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline u32 getTimeNs()
|
||||||
|
{
|
||||||
|
struct timespec ts;
|
||||||
|
clock_gettime(CLOCK_REALTIME, &ts);
|
||||||
|
return ts.tv_sec * 1000000000 + ts.tv_nsec;
|
||||||
|
}
|
||||||
|
|
||||||
/*#include <sys/timeb.h>
|
/*#include <sys/timeb.h>
|
||||||
inline u32 getTimeMs()
|
inline u32 getTimeMs()
|
||||||
{
|
{
|
||||||
|
@ -174,6 +222,22 @@ bool threadSetPriority(threadid_t tid, int prio);
|
||||||
}*/
|
}*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
inline u32 getTime(TimePrecision prec)
|
||||||
|
{
|
||||||
|
switch (prec) {
|
||||||
|
case PRECISION_SECONDS:
|
||||||
|
return getTimeS();
|
||||||
|
case PRECISION_MILLI:
|
||||||
|
return getTimeMs();
|
||||||
|
case PRECISION_MICRO:
|
||||||
|
return getTimeUs();
|
||||||
|
case PRECISION_NANO:
|
||||||
|
return getTimeNs();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // namespace porting
|
} // namespace porting
|
||||||
|
|
||||||
#endif // PORTING_HEADER
|
#endif // PORTING_HEADER
|
||||||
|
|
|
@ -23,19 +23,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "../log.h"
|
#include "../log.h"
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
|
||||||
TimeTaker::TimeTaker(const char *name, u32 *result)
|
TimeTaker::TimeTaker(const char *name, u32 *result, TimePrecision prec)
|
||||||
{
|
{
|
||||||
m_name = name;
|
m_name = name;
|
||||||
m_result = result;
|
m_result = result;
|
||||||
m_running = true;
|
m_running = true;
|
||||||
m_time1 = getTimeMs();
|
m_precision = prec;
|
||||||
|
m_time1 = getTime(prec);
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 TimeTaker::stop(bool quiet)
|
u32 TimeTaker::stop(bool quiet)
|
||||||
{
|
{
|
||||||
if(m_running)
|
if(m_running)
|
||||||
{
|
{
|
||||||
u32 time2 = getTimeMs();
|
u32 time2 = getTime(m_precision);
|
||||||
u32 dtime = time2 - m_time1;
|
u32 dtime = time2 - m_time1;
|
||||||
if(m_result != NULL)
|
if(m_result != NULL)
|
||||||
{
|
{
|
||||||
|
@ -52,9 +53,9 @@ u32 TimeTaker::stop(bool quiet)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 TimeTaker::getTime()
|
u32 TimeTaker::getTimerTime()
|
||||||
{
|
{
|
||||||
u32 time2 = getTimeMs();
|
u32 time2 = getTime(m_precision);
|
||||||
u32 dtime = time2 - m_time1;
|
u32 dtime = time2 - m_time1;
|
||||||
return dtime;
|
return dtime;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#define UTIL_TIMETAKER_HEADER
|
#define UTIL_TIMETAKER_HEADER
|
||||||
|
|
||||||
#include "../irrlichttypes.h"
|
#include "../irrlichttypes.h"
|
||||||
|
#include "../gettime.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TimeTaker
|
TimeTaker
|
||||||
|
@ -29,7 +30,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
class TimeTaker
|
class TimeTaker
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TimeTaker(const char *name, u32 *result=NULL);
|
TimeTaker(const char *name, u32 *result=NULL,
|
||||||
|
TimePrecision=PRECISION_MILLI);
|
||||||
|
|
||||||
~TimeTaker()
|
~TimeTaker()
|
||||||
{
|
{
|
||||||
|
@ -38,12 +40,13 @@ public:
|
||||||
|
|
||||||
u32 stop(bool quiet=false);
|
u32 stop(bool quiet=false);
|
||||||
|
|
||||||
u32 getTime();
|
u32 getTimerTime();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const char *m_name;
|
const char *m_name;
|
||||||
u32 m_time1;
|
u32 m_time1;
|
||||||
bool m_running;
|
bool m_running;
|
||||||
|
TimePrecision m_precision;
|
||||||
u32 *m_result;
|
u32 *m_result;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue