25 #include <sys/sys_time.h> 26 #include <sys/time_util.h> 30 #if defined (SUNOS) || defined (__SUNOS__) 34 #if defined(WIN32) || defined(_WIN32) 36 #define BT_USE_WINDOWS_TIMERS 37 #define WIN32_LEAN_AND_MEAN 60 #define mymin(a,b) (a > b ? a : b) 65 #ifdef BT_USE_WINDOWS_TIMERS 74 struct timeval mStartTime;
76 #endif //__CELLOS_LV2__ 84 #ifdef BT_USE_WINDOWS_TIMERS 85 QueryPerformanceFrequency(&m_data->mClockFrequency);
111 #ifdef BT_USE_WINDOWS_TIMERS 112 QueryPerformanceCounter(&m_data->mStartTime);
114 m_data->mPrevElapsedTime = 0;
116 #ifdef __CELLOS_LV2__ 121 SYS_TIMEBASE_GET( newTime );
122 m_data->mStartTime = newTime;
124 gettimeofday(&m_data->mStartTime, 0);
133 #ifdef BT_USE_WINDOWS_TIMERS 134 LARGE_INTEGER currentTime;
135 QueryPerformanceCounter(¤tTime);
136 LONGLONG elapsedTime = currentTime.QuadPart -
137 m_data->mStartTime.QuadPart;
139 unsigned long msecTicks = (
unsigned long)(1000 * elapsedTime /
140 m_data->mClockFrequency.QuadPart);
144 unsigned long elapsedTicks = (
unsigned long)(
GetTickCount64() - m_data->mStartTick);
145 signed long msecOff = (
signed long)(msecTicks - elapsedTicks);
146 if (msecOff < -100 || msecOff > 100)
149 LONGLONG msecAdjustment =
mymin(msecOff *
150 m_data->mClockFrequency.QuadPart / 1000, elapsedTime -
151 m_data->mPrevElapsedTime);
152 m_data->mStartTime.QuadPart += msecAdjustment;
153 elapsedTime -= msecAdjustment;
156 msecTicks = (
unsigned long)(1000 * elapsedTime /
157 m_data->mClockFrequency.QuadPart);
161 m_data->mPrevElapsedTime = elapsedTime;
166 #ifdef __CELLOS_LV2__ 167 uint64_t freq=sys_time_get_timebase_frequency();
168 double dFreq=((double) freq) / 1000.0;
171 SYS_TIMEBASE_GET( newTime );
174 return (
unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq);
177 struct timeval currentTime;
178 gettimeofday(¤tTime, 0);
179 return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000 +
180 (currentTime.tv_usec - m_data->mStartTime.tv_usec) / 1000;
181 #endif //__CELLOS_LV2__ 189 #ifdef BT_USE_WINDOWS_TIMERS 190 LARGE_INTEGER currentTime;
191 QueryPerformanceCounter(¤tTime);
192 LONGLONG elapsedTime = currentTime.QuadPart -
193 m_data->mStartTime.QuadPart;
196 unsigned long msecTicks = (
unsigned long)(1000 * elapsedTime /
197 m_data->mClockFrequency.QuadPart);
202 unsigned long elapsedTicks = (
unsigned long)(
GetTickCount64() - m_data->mStartTick);
203 signed long msecOff = (
signed long)(msecTicks - elapsedTicks);
204 if (msecOff < -100 || msecOff > 100)
207 LONGLONG msecAdjustment =
mymin(msecOff *
208 m_data->mClockFrequency.QuadPart / 1000, elapsedTime -
209 m_data->mPrevElapsedTime);
210 m_data->mStartTime.QuadPart += msecAdjustment;
211 elapsedTime -= msecAdjustment;
215 m_data->mPrevElapsedTime = elapsedTime;
218 unsigned long usecTicks = (
unsigned long)(1000000 * elapsedTime /
219 m_data->mClockFrequency.QuadPart);
224 #ifdef __CELLOS_LV2__ 225 uint64_t freq=sys_time_get_timebase_frequency();
226 double dFreq=((double) freq)/ 1000000.0;
230 SYS_TIMEBASE_GET( newTime );
232 return (
unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq);
235 struct timeval currentTime;
236 gettimeofday(¤tTime, 0);
237 return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000000 +
238 (currentTime.tv_usec - m_data->mStartTime.tv_usec);
239 #endif//__CELLOS_LV2__ 250 return btScalar(getTimeMicroseconds()) * microseconds_to_seconds;
289 RecursionCounter( 0 ),
326 if ( child->
Name == name ) {
368 unsigned long int time;
384 CurrentParent = start;
385 CurrentChild = CurrentParent->
Get_Child();
391 CurrentChild = CurrentParent->Get_Child();
397 CurrentChild = CurrentChild->Get_Sibling();
403 return CurrentChild == NULL;
409 CurrentChild = CurrentParent->Get_Child();
410 while ( (CurrentChild != NULL) && (index != 0) ) {
412 CurrentChild = CurrentChild->Get_Sibling();
415 if ( CurrentChild != NULL ) {
416 CurrentParent = CurrentChild;
417 CurrentChild = CurrentParent->Get_Child();
424 if ( CurrentParent->Get_Parent() != NULL ) {
425 CurrentParent = CurrentParent->Get_Parent();
427 CurrentChild = CurrentParent->Get_Child();
458 if (name != CurrentNode->Get_Name()) {
459 CurrentNode = CurrentNode->Get_Sub_Node( name );
473 if (CurrentNode->Return()) {
474 CurrentNode = CurrentNode->Get_Parent();
486 gProfileClock.
reset();
508 unsigned long int time;
518 profileIterator->
First();
519 if (profileIterator->
Is_Done())
525 for (i=0;i<spacing;i++) printf(
".");
526 printf(
"----------------------------------\n");
527 for (i=0;i<spacing;i++) printf(
".");
528 printf(
"Profiling: %s (total running time: %.3f ms) ---\n", profileIterator->
Get_Current_Parent_Name(), parent_time );
529 float totalTime = 0.f;
534 for (i = 0; !profileIterator->
Is_Done(); i++,profileIterator->
Next())
538 accumulated_time += current_total_time;
539 float fraction = parent_time >
SIMD_EPSILON ? (current_total_time / parent_time) * 100 : 0.f;
541 int i;
for (i=0;i<spacing;i++) printf(
".");
543 printf(
"%d -- %s (%.2f %%) :: %.3f ms / frame (%d calls)\n",i, profileIterator->
Get_Current_Name(), fraction,(current_total_time / (double)frames_since_reset),profileIterator->
Get_Current_Total_Calls());
544 totalTime += current_total_time;
548 if (parent_time < accumulated_time)
552 for (i=0;i<spacing;i++) printf(
".");
553 printf(
"%s (%.3f %%) :: %.3f ms\n",
"Unaccounted:",parent_time >
SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time);
555 for (i=0;i<numChildren;i++)
558 dumpRecursive(profileIterator,spacing+3);
570 dumpRecursive(profileIterator,0);
578 #endif //BT_NO_PROFILE CProfileNode * Get_Sub_Node(const char *name)
static CProfileNode * CurrentNode
CProfileNode * Get_Child(void)
unsigned long long int uint64_t
CProfileIterator(CProfileNode *start)
static void Start_Profile(const char *name)
btScalar getTimeSeconds()
Returns the time in s since the last call to reset or since the Clock was created.
LONGLONG mPrevElapsedTime
const char * Get_Current_Name(void)
float Get_Current_Parent_Total_Time(void)
unsigned long int getTimeMicroseconds()
Returns the time in us since the last call to reset or since the Clock was created.
The btClock is a portable basic clock that measures accurate time in seconds, use for profiling...
float Get_Current_Total_Time(void)
void Enter_Child(int index)
void reset()
Resets the initial reference time.
An iterator to navigate through the tree.
static void Stop_Profile(void)
float Profile_Get_Tick_Rate(void)
unsigned long int getTimeMilliseconds()
Returns the time in ms since the last call to reset or since the btClock was created.
static void dumpRecursive(CProfileIterator *profileIterator, int spacing)
static unsigned long int ResetTime
btClock()
The btClock is a portable basic clock that measures accurate time in seconds, use for profiling...
struct btClockData * m_data
void Profile_Get_Ticks(unsigned long int *ticks)
static void Release_Iterator(CProfileIterator *iterator)
btClock & operator=(const btClock &other)
static btClock gProfileClock
static float Get_Time_Since_Reset(void)
A node in the Profile Hierarchy Tree.
static void Increment_Frame_Counter(void)
int Get_Current_Total_Calls(void)
unsigned long int StartTime
CProfileNode(const char *name, CProfileNode *parent)
ULONGLONG GetTickCount64()
LARGE_INTEGER mClockFrequency
static CProfileIterator * Get_Iterator(void)
static int Get_Frame_Count_Since_Reset(void)
const char * Get_Current_Parent_Name(void)
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...