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 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

View File

@ -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(m_device == NULL) if (prec == PRECISION_MILLI) {
return 0; if(m_device == NULL)
return m_device->getTimer()->getRealTime(); return 0;
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;

View File

@ -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

View File

@ -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;
} }

View File

@ -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;
}; };