Skip to content

Commit

Permalink
Add varying levels of precision to TimeTaker
Browse files Browse the repository at this point in the history
  • Loading branch information
kwolekr committed Mar 29, 2013
1 parent 5e7e034 commit df49b93
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 17 deletions.
8 changes: 8 additions & 0 deletions src/gettime.h
Expand Up @@ -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
Expand Down
35 changes: 25 additions & 10 deletions src/main.cpp
Expand Up @@ -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
Expand All @@ -142,7 +147,7 @@ u32 getTimeMs()
class TimeGetter
{
public:
virtual u32 getTime() = 0;
virtual u32 getTime(TimePrecision prec) = 0;
};

// A precise irrlicht one
Expand All @@ -152,11 +157,15 @@ class IrrlichtTimeGetter: public TimeGetter
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;
Expand All @@ -165,9 +174,9 @@ class IrrlichtTimeGetter: public TimeGetter
class SimpleTimeGetter: public TimeGetter
{
public:
u32 getTime()
u32 getTime(TimePrecision prec)
{
return porting::getTimeMs();
return porting::getTime(prec);
}
};

Expand All @@ -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
Expand Down Expand Up @@ -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;
Expand Down
64 changes: 64 additions & 0 deletions src/porting.h
Expand Up @@ -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"
Expand Down Expand Up @@ -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()
{
Expand All @@ -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
Expand Down
11 changes: 6 additions & 5 deletions src/util/timetaker.cpp
Expand Up @@ -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)
{
Expand All @@ -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;
}
Expand Down
7 changes: 5 additions & 2 deletions src/util/timetaker.h
Expand Up @@ -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
Expand All @@ -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()
{
Expand All @@ -38,12 +40,13 @@ class TimeTaker

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

Expand Down

0 comments on commit df49b93

Please sign in to comment.