00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef _rlog_time_incl
00020 #define _rlog_time_incl
00021
00022 #include <rlog/common.h>
00023
00028 #ifdef _WIN32
00029
00030 #include <windows.h>
00031
00032 #define HAVE_QUERYPERFORMANCECOUNTER 1
00033
00034 typedef __int64 rlog_time_interval;
00035
00036 #if HAVE_QUERYPERFORMANCECOUNTER
00037
00038 typedef LARGE_INTEGER rlog_time;
00039
00040 #define RLOG_TIME_UNIT "clock cycles"
00041
00042 inline
00043 void rlog_get_time(rlog_time *pt)
00044 {
00045 QueryPerformanceCounter(pt);
00046 }
00047
00048 inline
00049 rlog_time_interval rlog_time_diff(const rlog_time& end, const rlog_time& start)
00050 {
00051 long long llEnd, llStart;
00052 memcpy(&llEnd, &end, sizeof(long long));
00053 memcpy(&llStart, &start, sizeof(long long));
00054 return llEnd - llStart;
00055 }
00056
00057 #else // !HAVE_QUERYPERFORMANCECOUNTER
00058
00059 typedef FILETIME rlog_time;
00060
00061 #define RLOG_TIME_UNIT "usec"
00062
00063 inline
00064 void rlog_get_time(rlog_time *pt)
00065 {
00066 GetSystemTimeAsFileTime(pt);
00067 }
00068
00069 inline
00070 rlog_time_interval rlog_time_diff(const rlog_time& end, const rlog_time& start)
00071 {
00072 ULONGLONG ullEnd, ullStart;
00073 memcpy(&ullEnd, &end, sizeof(ULONGLONG));
00074 memcpy(&ullStart, &start, sizeof(ULONGLONG));
00075 return 10*(ullEnd - ullStart);
00076 }
00077
00078 #endif // HAVE_QUERYPERFORMANCECOUNTER
00079
00080 inline
00081 void sleep(int seconds)
00082 {
00083 ::Sleep(seconds * 1000);
00084 }
00085
00086 #else // Unix
00087
00088 #include <sys/time.h>
00089 #include <unistd.h>
00090
00091 #if RLOG_TIME_TSC
00092
00093 #include <stdint.h>
00094
00095 typedef uint64_t rlog_time;
00096 typedef int64_t rlog_time_interval;
00097
00098 #define RLOG_TIME_UNIT "clock cycles"
00099
00100 inline void rlog_get_time(uint64_t *pt)
00101 {
00102 asm volatile("RDTSC" : "=A" (*pt));
00103 }
00104
00105 inline
00106 rlog_time_interval rlog_time_diff( const rlog_time &end, const rlog_time &start )
00107 {
00108 return end - start;
00109 }
00110
00111 #else // !HAVE_TSC
00112
00113 #include <unistd.h>
00114
00115 typedef timeval rlog_time;
00116 typedef long rlog_time_interval;
00117
00118 #define RLOG_TIME_UNIT "usec"
00119
00120 inline
00121 void rlog_get_time(rlog_time *pt)
00122 {
00123 gettimeofday( pt, 0 );
00124 }
00125
00126 inline
00127 rlog_time_interval rlog_time_diff( const rlog_time &end, const rlog_time &start )
00128 {
00129 return (end.tv_sec - start.tv_sec) * 1000 * 1000 +
00130 (end.tv_usec - start.tv_usec);
00131 }
00132
00133 #endif // HAVE_TSC/!HAVE_TSC
00134
00135 #endif // Win32/Unix
00136
00137 #endif // _rlog_time_incl