Add varying levels of precision to TimeTaker

This commit is contained in:
kwolekr 2013-03-29 16:51:57 -04:00
parent 5e7e0347cd
commit df49b93877
5 changed files with 108 additions and 17 deletions

View File

@ -31,7 +31,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Normal build: main.cpp
Server build: servermain.cpp
*/
enum TimePrecision {
PRECISION_SECONDS,
PRECISION_MILLI,
PRECISION_MICRO,
PRECISION_NANO
};
extern u32 getTimeMs();
extern u32 getTime(TimePrecision prec);
/*
Timestamp stuff

View File

@ -133,7 +133,12 @@ MainGameCallback *g_gamecallback = NULL;
u32 getTimeMs()
{
/* 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
@ -142,7 +147,7 @@ u32 getTimeMs()
class TimeGetter
{
public:
virtual u32 getTime() = 0;
virtual u32 getTime(TimePrecision prec) = 0;
};
// A precise irrlicht one
@ -152,11 +157,15 @@ public:
IrrlichtTimeGetter(IrrlichtDevice *device):
m_device(device)
{}
u32 getTime()
u32 getTime(TimePrecision prec)
{
if(m_device == NULL)
return 0;
return m_device->getTimer()->getRealTime();
if (prec == PRECISION_MILLI) {
if(m_device == NULL)
return 0;
return m_device->getTimer()->getRealTime();
} else {
return porting::getTime(prec);
}
}
private:
IrrlichtDevice *m_device;
@ -165,9 +174,9 @@ private:
class SimpleTimeGetter: public TimeGetter
{
public:
u32 getTime()
u32 getTime(TimePrecision prec)
{
return porting::getTimeMs();
return porting::getTime(prec);
}
};
@ -179,7 +188,13 @@ u32 getTimeMs()
{
if(g_timegetter == NULL)
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
@ -805,7 +820,7 @@ void SpeedTests()
}
}
// Do at least 10ms
while(timer.getTime() < 10);
while(timer.getTimerTime() < 10);
u32 dtime = timer.stop();
u32 per_ms = n / dtime;

View File

@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes.h" // u32
#include "debug.h"
#include "constants.h"
#include "gettime.h"
#ifdef _MSC_VER
#define SWPRINTF_CHARSTRING L"%S"
@ -153,18 +154,65 @@ bool threadSetPriority(threadid_t tid, int prio);
*/
#ifdef _WIN32 // Windows
#include <windows.h>
inline u32 getTimeS()
{
return GetTickCount() / 1000;
}
inline u32 getTimeMs()
{
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
#include <sys/time.h>
#include <time.h>
inline u32 getTimeS()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec;
}
inline u32 getTimeMs()
{
struct timeval tv;
gettimeofday(&tv, NULL);
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>
inline u32 getTimeMs()
{
@ -174,6 +222,22 @@ bool threadSetPriority(threadid_t tid, int prio);
}*/
#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
#endif // PORTING_HEADER

View File

@ -23,19 +23,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "../log.h"
#include <ostream>
TimeTaker::TimeTaker(const char *name, u32 *result)
TimeTaker::TimeTaker(const char *name, u32 *result, TimePrecision prec)
{
m_name = name;
m_result = result;
m_running = true;
m_time1 = getTimeMs();
m_precision = prec;
m_time1 = getTime(prec);
}
u32 TimeTaker::stop(bool quiet)
{
if(m_running)
{
u32 time2 = getTimeMs();
u32 time2 = getTime(m_precision);
u32 dtime = time2 - m_time1;
if(m_result != NULL)
{
@ -52,9 +53,9 @@ u32 TimeTaker::stop(bool quiet)
return 0;
}
u32 TimeTaker::getTime()
u32 TimeTaker::getTimerTime()
{
u32 time2 = getTimeMs();
u32 time2 = getTime(m_precision);
u32 dtime = time2 - m_time1;
return dtime;
}

View File

@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define UTIL_TIMETAKER_HEADER
#include "../irrlichttypes.h"
#include "../gettime.h"
/*
TimeTaker
@ -29,7 +30,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
class TimeTaker
{
public:
TimeTaker(const char *name, u32 *result=NULL);
TimeTaker(const char *name, u32 *result=NULL,
TimePrecision=PRECISION_MILLI);
~TimeTaker()
{
@ -38,12 +40,13 @@ public:
u32 stop(bool quiet=false);
u32 getTime();
u32 getTimerTime();
private:
const char *m_name;
u32 m_time1;
bool m_running;
TimePrecision m_precision;
u32 *m_result;
};