diff options
Diffstat (limited to 'rts')
-rw-r--r-- | rts/Profiling.c | 112 |
1 files changed, 94 insertions, 18 deletions
diff --git a/rts/Profiling.c b/rts/Profiling.c index a4fc281967..ea1e9dbb2e 100644 --- a/rts/Profiling.c +++ b/rts/Profiling.c @@ -119,16 +119,19 @@ static void findCCSMaxLens ( CostCentreStack *ccs, uint32_t indent, uint32_t *max_label_len, uint32_t *max_module_len, + uint32_t *max_src_len, uint32_t *max_id_len ); static void logCCS ( CostCentreStack *ccs, uint32_t indent, uint32_t max_label_len, uint32_t max_module_len, + uint32_t max_src_len, uint32_t max_id_len ); static void reportCCS ( CostCentreStack *ccs ); static CostCentreStack * checkLoop ( CostCentreStack *ccs, CostCentre *cc ); static CostCentreStack * pruneCCSTree ( CostCentreStack *ccs ); +static void sortCCSTree ( CostCentreStack *ccs ); static CostCentreStack * actualPush ( CostCentreStack *, CostCentre * ); static CostCentreStack * isInIndexTable ( IndexTable *, CostCentre * ); static IndexTable * addToIndexTable ( IndexTable *, CostCentreStack *, @@ -764,13 +767,14 @@ static void reportPerCCCosts( void ) { CostCentre *cc, *next; - uint32_t max_label_len, max_module_len; + uint32_t max_label_len, max_module_len, max_src_len; aggregateCCCosts(CCS_MAIN); sorted_cc_list = NULL; max_label_len = 11; // no shorter than the "COST CENTRE" header max_module_len = 6; // no shorter than the "MODULE" header + max_src_len = 3; // no shorter than the "SRC" header for (cc = CC_LIST; cc != NULL; cc = next) { next = cc->link; @@ -781,10 +785,12 @@ reportPerCCCosts( void ) max_label_len = stg_max(strlen_utf8(cc->label), max_label_len); max_module_len = stg_max(strlen_utf8(cc->module), max_module_len); + max_src_len = stg_max(strlen_utf8(cc->srcloc), max_src_len); } } - fprintf(prof_file, "%-*s %-*s", max_label_len, "COST CENTRE", max_module_len, "MODULE"); + fprintf(prof_file, "%-*s %-*s %-*s", + max_label_len, "COST CENTRE", max_module_len, "MODULE", max_src_len, "SRC"); fprintf(prof_file, " %6s %6s", "%time", "%alloc"); if (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE) { fprintf(prof_file, " %5s %9s", "ticks", "bytes"); @@ -795,11 +801,13 @@ reportPerCCCosts( void ) if (ignoreCC(cc)) { continue; } - fprintf(prof_file, "%s%*s %s%*s", + fprintf(prof_file, "%s%*s %s%*s %s%*s", cc->label, max_label_len - strlen_utf8(cc->label), "", cc->module, - max_module_len - strlen_utf8(cc->module), ""); + max_module_len - strlen_utf8(cc->module), "", + cc->srcloc, + max_src_len - strlen_utf8(cc->srcloc), ""); fprintf(prof_file, " %6.1f %6.1f", total_prof_ticks == 0 ? 0.0 : (cc->time_ticks / (StgFloat) total_prof_ticks * 100), @@ -823,17 +831,19 @@ reportPerCCCosts( void ) static void fprintHeader( uint32_t max_label_len, uint32_t max_module_len, - uint32_t max_id_len ) + uint32_t max_src_len, uint32_t max_id_len ) { - fprintf(prof_file, "%-*s %-*s %-*s %11s %12s %12s\n", + fprintf(prof_file, "%-*s %-*s %-*s %-*s %11s %12s %12s\n", max_label_len, "", max_module_len, "", + max_src_len, "", max_id_len, "", "", "individual", "inherited"); - fprintf(prof_file, "%-*s %-*s %-*s", + fprintf(prof_file, "%-*s %-*s %-*s %-*s", max_label_len, "COST CENTRE", max_module_len, "MODULE", + max_src_len, "SRC", max_id_len, "no."); fprintf(prof_file, " %11s %5s %6s %5s %6s", @@ -890,7 +900,9 @@ reportCCSProfiling( void ) inheritCosts(CCS_MAIN); - reportCCS(pruneCCSTree(CCS_MAIN)); + CostCentreStack *stack = pruneCCSTree(CCS_MAIN); + sortCCSTree(stack); + reportCCS(stack); } static uint32_t @@ -911,7 +923,7 @@ numDigits(StgInt i) { static void findCCSMaxLens(CostCentreStack *ccs, uint32_t indent, uint32_t *max_label_len, - uint32_t *max_module_len, uint32_t *max_id_len) { + uint32_t *max_module_len, uint32_t *max_src_len, uint32_t *max_id_len) { CostCentre *cc; IndexTable *i; @@ -919,19 +931,21 @@ findCCSMaxLens(CostCentreStack *ccs, uint32_t indent, uint32_t *max_label_len, *max_label_len = stg_max(*max_label_len, indent + strlen_utf8(cc->label)); *max_module_len = stg_max(*max_module_len, strlen_utf8(cc->module)); + *max_src_len = stg_max(*max_src_len, strlen_utf8(cc->srcloc)); *max_id_len = stg_max(*max_id_len, numDigits(ccs->ccsID)); for (i = ccs->indexTable; i != 0; i = i->next) { if (!i->back_edge) { findCCSMaxLens(i->ccs, indent+1, - max_label_len, max_module_len, max_id_len); + max_label_len, max_module_len, max_src_len, max_id_len); } } } static void logCCS(CostCentreStack *ccs, uint32_t indent, - uint32_t max_label_len, uint32_t max_module_len, uint32_t max_id_len) + uint32_t max_label_len, uint32_t max_module_len, + uint32_t max_src_len, uint32_t max_id_len) { CostCentre *cc; IndexTable *i; @@ -944,12 +958,14 @@ logCCS(CostCentreStack *ccs, uint32_t indent, /* force printing of *all* cost centres if -Pa */ { - fprintf(prof_file, "%-*s%s%*s %s%*s", + fprintf(prof_file, "%*s%s%*s %s%*s %s%*s", indent, "", cc->label, max_label_len-indent - strlen_utf8(cc->label), "", cc->module, - max_module_len - strlen_utf8(cc->module), ""); + max_module_len - strlen_utf8(cc->module), "", + cc->srcloc, + max_src_len - strlen_utf8(cc->srcloc), ""); fprintf(prof_file, " %*" FMT_Int "%11" FMT_Word64 " %5.1f %5.1f %5.1f %5.1f", @@ -969,7 +985,8 @@ logCCS(CostCentreStack *ccs, uint32_t indent, for (i = ccs->indexTable; i != 0; i = i->next) { if (!i->back_edge) { - logCCS(i->ccs, indent+1, max_label_len, max_module_len, max_id_len); + logCCS(i->ccs, indent+1, + max_label_len, max_module_len, max_src_len, max_id_len); } } } @@ -977,16 +994,18 @@ logCCS(CostCentreStack *ccs, uint32_t indent, static void reportCCS(CostCentreStack *ccs) { - uint32_t max_label_len, max_module_len, max_id_len; + uint32_t max_label_len, max_module_len, max_src_len, max_id_len; max_label_len = 11; // no shorter than "COST CENTRE" header max_module_len = 6; // no shorter than "MODULE" header + max_src_len = 3; // no shorter than "SRC" header max_id_len = 3; // no shorter than "no." header - findCCSMaxLens(ccs, 0, &max_label_len, &max_module_len, &max_id_len); + findCCSMaxLens(ccs, 0, + &max_label_len, &max_module_len, &max_src_len, &max_id_len); - fprintHeader(max_label_len, max_module_len, max_id_len); - logCCS(ccs, 0, max_label_len, max_module_len, max_id_len); + fprintHeader(max_label_len, max_module_len, max_src_len, max_id_len); + logCCS(ccs, 0, max_label_len, max_module_len, max_src_len, max_id_len); } @@ -1064,6 +1083,63 @@ pruneCCSTree (CostCentreStack *ccs) } } +static IndexTable* +insertIndexTableInSortedList(IndexTable* tbl, IndexTable* sortedList) +{ + StgWord tbl_ticks = tbl->ccs->scc_count; + char* tbl_label = tbl->ccs->cc->label; + + IndexTable *prev = NULL; + IndexTable *cursor = sortedList; + + while (cursor != NULL) { + StgWord cursor_ticks = cursor->ccs->scc_count; + char* cursor_label = cursor->ccs->cc->label; + + if (tbl_ticks > cursor_ticks || + (tbl_ticks == cursor_ticks && strcmp(tbl_label, cursor_label) < 0)) { + if (prev == NULL) { + tbl->next = sortedList; + return tbl; + } else { + prev->next = tbl; + tbl->next = cursor; + return sortedList; + } + } else { + prev = cursor; + cursor = cursor->next; + } + } + + prev->next = tbl; + return sortedList; +} + +static void +sortCCSTree(CostCentreStack *ccs) +{ + if (ccs->indexTable == NULL) return; + + for (IndexTable *tbl = ccs->indexTable; tbl != NULL; tbl = tbl->next) + if (!tbl->back_edge) + sortCCSTree(tbl->ccs); + + IndexTable *sortedList = ccs->indexTable; + IndexTable *nonSortedList = sortedList->next; + sortedList->next = NULL; + + while (nonSortedList != NULL) + { + IndexTable *nonSortedTail = nonSortedList->next; + nonSortedList->next = NULL; + sortedList = insertIndexTableInSortedList(nonSortedList, sortedList); + nonSortedList = nonSortedTail; + } + + ccs->indexTable = sortedList; +} + void fprintCCS( FILE *f, CostCentreStack *ccs ) { |