mt.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00039 #include "mt.h"
00040
00041 #include <string.h>
00042 #include <stdlib.h>
00043
00044 #ifdef _WIN32
00045 # include <windows.h>
00046 #else
00047 # include <time.h>
00048 #endif
00049
00054 #ifdef _WIN32
00055 # define mt_sint64 __int64
00056 # define mt_uint64 unsigned mt_sint64
00057 #else
00058 # define mt_sint64 long long
00059 # define mt_uint64 unsigned mt_sint64
00060 #endif
00061
00064 typedef struct mt_tag
00065 {
00066 int sz;
00067 int cp;
00068 mt_uint64 freq;
00069 mt_uint64 times[1];
00070 } MTimer;
00071
00075
00076
00077 MultiTimer MtCreate(int count)
00078 {
00079 MTimer * t;
00080
00081 t = (MTimer *)malloc(sizeof(*t) + count * sizeof(t->times));
00082 if (t != 0)
00083 {
00084 memset(t, 0, sizeof(*t) + count * sizeof(t->times));
00085 #ifdef _WIN32
00086 {
00087 LARGE_INTEGER fr, st;
00088 QueryPerformanceFrequency(&fr);
00089 t->freq = ((mt_uint64)fr.HighPart << 32) + fr.LowPart;
00090 QueryPerformanceCounter(&st);
00091 t->times[0] = ((mt_uint64)st.HighPart << 32) + st.LowPart;
00092 }
00093 #else
00094 t->freq = CLOCKS_PER_SEC;
00095 t->times[0] = clock();
00096 #endif
00097 t->sz = count;
00098 }
00099 return (MultiTimer *)t;
00100 }
00101
00102
00103
00104 void MtRecord(MultiTimer mt)
00105 {
00106 MTimer * t = (MTimer *)mt;
00107
00108 if (t->cp < t->sz)
00109 {
00110 #ifdef _WIN32
00111 LARGE_INTEGER tm;
00112 QueryPerformanceCounter(&tm);
00113 t->times[++t->cp] = ((mt_uint64)tm.HighPart << 32) + tm.LowPart;
00114 #else
00115 t->times[++t->cp] = clock();
00116 #endif
00117 }
00118 }
00119
00120
00121
00122 unsigned long MtGetRelativeNS(MultiTimer mt, int idx)
00123 {
00124 #define NS_PER_SEC 1000000000
00125
00126 MTimer * t = (MTimer *)mt;
00127
00128 if (idx > t->cp)
00129 return 0;
00130 return (unsigned long)((((t->times[idx + 1] - t->times[idx])
00131 * NS_PER_SEC) / t->freq) & 0xFFFFFFFF);
00132 }
00133
00134
00135
00136 void MtDestroy(MultiTimer mt)
00137 {
00138 free(mt);
00139 }
00140