| 555 | } |
| 556 | |
| 557 | static void profilerDataDumpRecurseFile(ProfilerData *data, char *buffer, U32 bufferLen, F64 totalTime, FileStream& fws) |
| 558 | { |
| 559 | char pbuffer[256]; |
| 560 | dSprintf(pbuffer, 255, "%7.3f %7.3f %8d %s%s\n", |
| 561 | 100 * data->mTotalTime / totalTime, |
| 562 | 100 * (data->mTotalTime - data->mSubTime) / totalTime, |
| 563 | data->mInvokeCount, |
| 564 | buffer, |
| 565 | data->mRoot ? data->mRoot->mName : "ROOT" ); |
| 566 | fws.write(dStrlen(pbuffer), pbuffer); |
| 567 | data->mTotalTime = 0; |
| 568 | data->mSubTime = 0; |
| 569 | data->mInvokeCount = 0; |
| 570 | |
| 571 | buffer[bufferLen] = ' '; |
| 572 | buffer[bufferLen+1] = ' '; |
| 573 | buffer[bufferLen+2] = 0; |
| 574 | // sort data's children... |
| 575 | ProfilerData *list = NULL; |
| 576 | while(data->mFirstChild) |
| 577 | { |
| 578 | ProfilerData *ins = data->mFirstChild; |
| 579 | data->mFirstChild = ins->mNextSibling; |
| 580 | ProfilerData **walk = &list; |
| 581 | while(*walk && (*walk)->mTotalTime > ins->mTotalTime) |
| 582 | walk = &(*walk)->mNextSibling; |
| 583 | ins->mNextSibling = *walk; |
| 584 | *walk = ins; |
| 585 | } |
| 586 | data->mFirstChild = list; |
| 587 | while(list) |
| 588 | { |
| 589 | if(list->mInvokeCount) |
| 590 | profilerDataDumpRecurseFile(list, buffer, bufferLen + 2, totalTime, fws); |
| 591 | list = list->mNextSibling; |
| 592 | } |
| 593 | buffer[bufferLen] = 0; |
| 594 | } |
| 595 | |
| 596 | void Profiler::dump() |
| 597 | { |