Skip to content
Permalink
Browse files

Add varying levels of precision to TimeTaker

  • Loading branch information
kwolekr committed Mar 29, 2013
1 parent 5e7e034 commit df49b93877b40551111be6ef5ecfe4629787ab75
Showing with 108 additions and 17 deletions.
  1. +8 −0 src/gettime.h
  2. +25 −10 src/main.cpp
  3. +64 −0 src/porting.h
  4. +6 −5 src/util/timetaker.cpp
  5. +5 −2 src/util/timetaker.h
@@ -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
@@ -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 @@ 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;
@@ -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);
}
};

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

0 comments on commit df49b93

Please sign in to comment.