|
Packit |
c948fe |
#ifndef GETTIME_H
|
|
Packit |
c948fe |
#define GETTIME_H
|
|
Packit |
c948fe |
|
|
Packit |
c948fe |
#include <sys/time.h>
|
|
Packit |
c948fe |
|
|
Packit |
c948fe |
|
|
Packit |
c948fe |
#define rdtscll(val) \
|
|
Packit |
c948fe |
__asm__ __volatile__("rdtsc" : "=A" (val))
|
|
Packit |
c948fe |
|
|
Packit |
c948fe |
#ifdef __i386__
|
|
Packit |
c948fe |
#define TIME(str, exp) { \
|
|
Packit |
c948fe |
long long _then, _now, best = 1000000000; \
|
|
Packit |
c948fe |
int i; \
|
|
Packit |
c948fe |
for (i=0; i<10; i++) { \
|
|
Packit |
c948fe |
rdtscll(_then); \
|
|
Packit |
c948fe |
exp; \
|
|
Packit |
c948fe |
rdtscll(_now); \
|
|
Packit |
c948fe |
if (_now - _then < best) { \
|
|
Packit |
c948fe |
best = _now - _then; \
|
|
Packit |
c948fe |
} \
|
|
Packit |
c948fe |
} \
|
|
Packit |
c948fe |
printf(str " took %.1f cycles/sample\n", (double)best/(double)SIZE); \
|
|
Packit |
c948fe |
}
|
|
Packit |
c948fe |
#else
|
|
Packit |
c948fe |
#define TIME(str, exp) { \
|
|
Packit |
c948fe |
double _then, _now; \
|
|
Packit |
c948fe |
_then = gettime(); \
|
|
Packit |
c948fe |
exp; \
|
|
Packit |
c948fe |
_now = gettime(); \
|
|
Packit |
c948fe |
printf(str " took %f us/sample\n", 1000000.0 * (_now-_then) / (double)SIZE); \
|
|
Packit |
c948fe |
}
|
|
Packit |
c948fe |
#endif
|
|
Packit |
c948fe |
|
|
Packit |
c948fe |
static inline double gettime()
|
|
Packit |
c948fe |
{
|
|
Packit |
c948fe |
struct timeval tv;
|
|
Packit |
c948fe |
|
|
Packit |
c948fe |
gettimeofday(&tv, NULL);
|
|
Packit |
c948fe |
|
|
Packit |
c948fe |
return (double)(tv.tv_usec * 1.0e-6) + (double)(tv.tv_sec);
|
|
Packit |
c948fe |
}
|
|
Packit |
c948fe |
|
|
Packit |
c948fe |
#endif
|