22 #include <sys/sys_time.h> 23 #include <sys/time_util.h> 27 #if defined (SUNOS) || defined (__SUNOS__) 31 #if defined(WIN32) || defined(_WIN32) 33 #define BT_USE_WINDOWS_TIMERS 34 #define WIN32_LEAN_AND_MEAN 45 #define GetTickCount64 GetTickCount 57 #define mymin(a,b) (a > b ? a : b) 62 #ifdef BT_USE_WINDOWS_TIMERS 71 struct timeval mStartTime;
73 #endif //__CELLOS_LV2__ 81 #ifdef BT_USE_WINDOWS_TIMERS 82 QueryPerformanceFrequency(&m_data->mClockFrequency);
108 #ifdef BT_USE_WINDOWS_TIMERS 109 QueryPerformanceCounter(&m_data->mStartTime);
111 m_data->mPrevElapsedTime = 0;
113 #ifdef __CELLOS_LV2__ 118 SYS_TIMEBASE_GET( newTime );
119 m_data->mStartTime = newTime;
121 gettimeofday(&m_data->mStartTime, 0);
130 #ifdef BT_USE_WINDOWS_TIMERS 131 LARGE_INTEGER currentTime;
132 QueryPerformanceCounter(¤tTime);
133 LONGLONG elapsedTime = currentTime.QuadPart -
134 m_data->mStartTime.QuadPart;
136 unsigned long msecTicks = (
unsigned long)(1000 * elapsedTime /
137 m_data->mClockFrequency.QuadPart);
141 unsigned long elapsedTicks = (
unsigned long)(
GetTickCount64() - m_data->mStartTick);
142 signed long msecOff = (
signed long)(msecTicks - elapsedTicks);
143 if (msecOff < -100 || msecOff > 100)
146 LONGLONG msecAdjustment =
mymin(msecOff *
147 m_data->mClockFrequency.QuadPart / 1000, elapsedTime -
148 m_data->mPrevElapsedTime);
149 m_data->mStartTime.QuadPart += msecAdjustment;
150 elapsedTime -= msecAdjustment;
153 msecTicks = (
unsigned long)(1000 * elapsedTime /
154 m_data->mClockFrequency.QuadPart);
158 m_data->mPrevElapsedTime = elapsedTime;
163 #ifdef __CELLOS_LV2__ 164 uint64_t freq=sys_time_get_timebase_frequency();
165 double dFreq=((double) freq) / 1000.0;
168 SYS_TIMEBASE_GET( newTime );
171 return (
unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq);
174 struct timeval currentTime;
175 gettimeofday(¤tTime, 0);
176 return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000 +
177 (currentTime.tv_usec - m_data->mStartTime.tv_usec) / 1000;
178 #endif //__CELLOS_LV2__ 186 #ifdef BT_USE_WINDOWS_TIMERS 187 LARGE_INTEGER currentTime;
188 QueryPerformanceCounter(¤tTime);
189 LONGLONG elapsedTime = currentTime.QuadPart -
190 m_data->mStartTime.QuadPart;
193 unsigned long msecTicks = (
unsigned long)(1000 * elapsedTime /
194 m_data->mClockFrequency.QuadPart);
199 unsigned long elapsedTicks = (
unsigned long)(
GetTickCount64() - m_data->mStartTick);
200 signed long msecOff = (
signed long)(msecTicks - elapsedTicks);
201 if (msecOff < -100 || msecOff > 100)
204 LONGLONG msecAdjustment =
mymin(msecOff *
205 m_data->mClockFrequency.QuadPart / 1000, elapsedTime -
206 m_data->mPrevElapsedTime);
207 m_data->mStartTime.QuadPart += msecAdjustment;
208 elapsedTime -= msecAdjustment;
212 m_data->mPrevElapsedTime = elapsedTime;
215 unsigned long usecTicks = (
unsigned long)(1000000 * elapsedTime /
216 m_data->mClockFrequency.QuadPart);
221 #ifdef __CELLOS_LV2__ 222 uint64_t freq=sys_time_get_timebase_frequency();
223 double dFreq=((double) freq)/ 1000000.0;
227 SYS_TIMEBASE_GET( newTime );
229 return (
unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq);
232 struct timeval currentTime;
233 gettimeofday(¤tTime, 0);
234 return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000000 +
235 (currentTime.tv_usec - m_data->mStartTime.tv_usec);
236 #endif//__CELLOS_LV2__ 247 return btScalar(getTimeMicroseconds()) * microseconds_to_seconds;
250 #ifndef BT_NO_PROFILE 256 inline void Profile_Get_Ticks(
unsigned long int * ticks)
261 inline float Profile_Get_Tick_Rate(
void)
284 CProfileNode::CProfileNode(
const char * name, CProfileNode * parent ) :
289 RecursionCounter( 0 ),
299 void CProfileNode::CleanupMemory()
307 CProfileNode::~CProfileNode(
void )
321 CProfileNode * CProfileNode::Get_Sub_Node(
const char * name )
324 CProfileNode * child = Child;
326 if ( child->Name == name ) {
329 child = child->Sibling;
334 CProfileNode * node =
new CProfileNode( name,
this );
335 node->Sibling = Child;
341 void CProfileNode::Reset(
void )
356 void CProfileNode::Call(
void )
359 if (RecursionCounter++ == 0) {
360 Profile_Get_Ticks(&StartTime);
365 bool CProfileNode::Return(
void )
367 if ( --RecursionCounter == 0 && TotalCalls != 0 ) {
368 unsigned long int time;
369 Profile_Get_Ticks(&time);
371 TotalTime += (float)time / Profile_Get_Tick_Rate();
373 return ( RecursionCounter == 0 );
382 CProfileIterator::CProfileIterator( CProfileNode * start )
384 CurrentParent = start;
385 CurrentChild = CurrentParent->Get_Child();
389 void CProfileIterator::First(
void)
391 CurrentChild = CurrentParent->Get_Child();
395 void CProfileIterator::Next(
void)
397 CurrentChild = CurrentChild->Get_Sibling();
401 bool CProfileIterator::Is_Done(
void)
403 return CurrentChild == NULL;
407 void CProfileIterator::Enter_Child(
int index )
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();
422 void CProfileIterator::Enter_Parent(
void )
424 if ( CurrentParent->Get_Parent() != NULL ) {
425 CurrentParent = CurrentParent->Get_Parent();
427 CurrentChild = CurrentParent->Get_Child();
437 CProfileNode CProfileManager::Root(
"Root", NULL );
438 CProfileNode * CProfileManager::CurrentNode = &CProfileManager::Root;
439 int CProfileManager::FrameCounter = 0;
440 unsigned long int CProfileManager::ResetTime = 0;
456 void CProfileManager::Start_Profile(
const char * name )
458 if (name != CurrentNode->Get_Name()) {
459 CurrentNode = CurrentNode->Get_Sub_Node( name );
469 void CProfileManager::Stop_Profile(
void )
473 if (CurrentNode->Return()) {
474 CurrentNode = CurrentNode->Get_Parent();
484 void CProfileManager::Reset(
void )
486 gProfileClock.
reset();
490 Profile_Get_Ticks(&ResetTime);
497 void CProfileManager::Increment_Frame_Counter(
void )
506 float CProfileManager::Get_Time_Since_Reset(
void )
508 unsigned long int time;
509 Profile_Get_Ticks(&time);
511 return (
float)time / Profile_Get_Tick_Rate();
516 void CProfileManager::dumpRecursive(CProfileIterator* profileIterator,
int spacing)
518 profileIterator->First();
519 if (profileIterator->Is_Done())
522 float accumulated_time=0,parent_time = profileIterator->Is_Root() ? CProfileManager::Get_Time_Since_Reset() : profileIterator->Get_Current_Parent_Total_Time();
524 int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset();
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())
537 float current_total_time = profileIterator->Get_Current_Total_Time();
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++)
557 profileIterator->Enter_Child(i);
558 dumpRecursive(profileIterator,spacing+3);
559 profileIterator->Enter_Parent();
565 void CProfileManager::dumpAll()
567 CProfileIterator* profileIterator = 0;
568 profileIterator = CProfileManager::Get_Iterator();
570 dumpRecursive(profileIterator,0);
572 CProfileManager::Release_Iterator(profileIterator);
578 #endif //BT_NO_PROFILE
unsigned long long int uint64_t
btScalar getTimeSeconds()
Returns the time in s since the last call to reset or since the Clock was created.
LONGLONG mPrevElapsedTime
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...
void reset()
Resets the initial reference time.
unsigned long int getTimeMilliseconds()
Returns the time in ms since the last call to reset or since the btClock was created.
btClock()
The btClock is a portable basic clock that measures accurate time in seconds, use for profiling...
struct btClockData * m_data
btClock & operator=(const btClock &other)
LARGE_INTEGER mClockFrequency
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...