Commit 5ee90f9b authored by simonmar's avatar simonmar
Browse files

[project @ 2000-05-12 13:01:04 by simonmar]

The time/allocation profile now shows costs as both

	- "individual" (incurred by the specific cost-centre stack), and
	- "inherited" (incurrent by the cost-centre stack and all its
	  children).

In addition, the "inner" column has been removed (should be the same
as the sum of the scc counts of the children of the current node), and
the "caf" column has been removed (wasn't very useful).
parent 199edad7
/* -----------------------------------------------------------------------------
* $Id: StgProf.h,v 1.9 2000/04/03 15:54:49 simonmar Exp $
* $Id: StgProf.h,v 1.10 2000/05/12 13:01:04 simonmar Exp $
*
* (c) The GHC Team, 1998
*
......@@ -65,13 +65,14 @@ typedef struct _CostCentreStack {
struct _IndexTable *indexTable;
unsigned long scc_count;
unsigned long sub_scc_count;
unsigned long sub_cafcc_count;
unsigned long time_ticks;
unsigned long mem_alloc;
unsigned long mem_resid;
unsigned long inherited_ticks;
unsigned long inherited_alloc;
CostCentre *root;
} CostCentreStack;
......@@ -192,11 +193,11 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */
prevStack : NULL, \
indexTable : NULL, \
scc_count : 0, \
sub_scc_count : 0, \
sub_cafcc_count : 0, \
time_ticks : 0, \
mem_alloc : 0, \
mem_resid : 0, \
inherited_ticks : 0, \
inherited_alloc : 0, \
root : 0, \
}};
......@@ -226,7 +227,6 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */
# define SET_CCC_X(cc,do_subcc_count,do_scc_count) \
do { \
if (do_subcc_count) { CCCS->sub_scc_count++; } \
CCCS = PushCostCentre(CCCS,cc); \
if (do_scc_count) { CCCS->scc_count++; } \
} while(0)
......@@ -268,7 +268,6 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */
do { \
(stack)->scc_count = 0; \
(stack)->time_ticks = 0; \
(stack)->sub_cafcc_count = 0; \
(stack)->mem_alloc = 0; \
} while(0)
......@@ -286,8 +285,6 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */
#define ENTER_CCS_CAF_X(ccs) \
do { \
/* inc subcaf count of CCCS */ \
CCCS->sub_cafcc_count++; \
/* set CCCS to ident ccs */ \
CCCS = (CostCentreStack *)(ccs); \
/* inc scc count of CAF ccs */ \
......
/* -----------------------------------------------------------------------------
* $Id: Profiling.c,v 1.19 2000/04/19 12:42:48 simonmar Exp $
* $Id: Profiling.c,v 1.20 2000/05/12 13:01:04 simonmar Exp $
*
* (c) The GHC Team, 1998-2000
*
......@@ -119,21 +119,21 @@ CCS_DECLARE(CCS_DONT_CARE, CC_DONT_CARE, );
* Static Functions
*/
static CostCentreStack * ActualPush_ ( CostCentreStack *ccs, CostCentre *cc,
CostCentreStack *new_ccs );
static rtsBool ccs_to_ignore ( CostCentreStack *ccs );
static void count_ticks ( CostCentreStack *ccs );
static void reportCCS ( CostCentreStack *ccs, nat indent );
static void DecCCS ( CostCentreStack *ccs );
static void DecBackEdge ( CostCentreStack *ccs, CostCentreStack *oldccs );
static CostCentreStack *CheckLoop ( CostCentreStack *ccs, CostCentre *cc );
static CostCentreStack *pruneCCSTree ( CostCentreStack *ccs );
static CostCentreStack *ActualPush ( CostCentreStack *, CostCentre * );
static CostCentreStack *IsInIndexTable ( IndexTable *, CostCentre * );
static IndexTable *AddToIndexTable ( IndexTable *, CostCentreStack *,
CostCentre *, unsigned int );
static CostCentreStack * ActualPush_ ( CostCentreStack *ccs, CostCentre *cc,
CostCentreStack *new_ccs );
static rtsBool ccs_to_ignore ( CostCentreStack *ccs );
static void count_ticks ( CostCentreStack *ccs );
static void inherit_costs ( CostCentreStack *ccs );
static void reportCCS ( CostCentreStack *ccs, nat indent );
static void DecCCS ( CostCentreStack *ccs );
static void DecBackEdge ( CostCentreStack *ccs,
CostCentreStack *oldccs );
static CostCentreStack * CheckLoop ( CostCentreStack *ccs, CostCentre *cc );
static CostCentreStack * pruneCCSTree ( CostCentreStack *ccs );
static CostCentreStack * ActualPush ( CostCentreStack *, CostCentre * );
static CostCentreStack * IsInIndexTable ( IndexTable *, CostCentre * );
static IndexTable * AddToIndexTable ( IndexTable *, CostCentreStack *,
CostCentre *, unsigned int );
#ifdef DEBUG
static void printCCS ( CostCentreStack *ccs );
......@@ -431,14 +431,14 @@ ActualPush_ ( CostCentreStack *ccs, CostCentre *cc, CostCentreStack *new_ccs )
/* Initialise the various _scc_ counters to zero
*/
new_ccs->scc_count = 0;
new_ccs->sub_scc_count = 0;
new_ccs->sub_cafcc_count = 0;
/* Initialize all other stats here. There should be a quick way
* that's easily used elsewhere too
*/
new_ccs->time_ticks = 0;
new_ccs->mem_alloc = 0;
new_ccs->inherited_ticks = 0;
new_ccs->inherited_alloc = 0;
new_ccs->root = ccs->root;
......@@ -487,27 +487,6 @@ AddToIndexTable(IndexTable *it, CostCentreStack *new_ccs,
}
void
print_ccs (FILE *fp, CostCentreStack *ccs)
{
if (ccs == CCCS) {
fprintf(fp, "Cost-Centre Stack: ");
}
if (ccs != CCS_MAIN)
{
print_ccs(fp, ccs->prevStack);
fprintf(fp, "->[%s,%s]", ccs->cc->label, ccs->cc->module);
} else {
fprintf(fp, "[%s,%s]", ccs->cc->label, ccs->cc->module);
}
if (ccs == CCCS) {
fprintf(fp, "\n");
}
}
static void
DecCCS(CostCentreStack *ccs)
{
......@@ -625,9 +604,10 @@ report_per_cc_costs( void )
static void
fprint_header( void )
{
fprintf(prof_file, "%-24s %-10s", "COST CENTRE", "MODULE");
fprintf(prof_file, "%-24s %-10s individual inherited\n", "", "");
fprintf(prof_file, "%8s %5s %5s %8s %5s", "scc", "%time", "%alloc", "inner", "cafs");
fprintf(prof_file, "%-24s %-10s", "COST CENTRE", "MODULE");
fprintf(prof_file, "%8s %5s %5s %5s %5s", "entries", "%time", "%alloc", "%time", "%alloc");
if (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE) {
fprintf(prof_file, " %5s %9s", "ticks", "bytes");
......@@ -690,6 +670,8 @@ report_ccs_profiling( void )
report_per_cc_costs();
inherit_costs(CCS_MAIN);
fprint_header();
reportCCS(pruneCCSTree(CCS_MAIN), 0);
......@@ -714,12 +696,14 @@ reportCCS(CostCentreStack *ccs, nat indent)
fprintf(prof_file, "%-*s%-*s %-10s",
indent, "", 24-indent, cc->label, cc->module);
fprintf(prof_file, "%8ld %5.1f %5.1f %8ld %5ld",
fprintf(prof_file, "%8ld %5.1f %5.1f %5.1f %5.1f",
ccs->scc_count,
total_prof_ticks == 0 ? 0.0 : (ccs->time_ticks / (StgFloat) total_prof_ticks * 100),
total_alloc == 0 ? 0.0 : (ccs->mem_alloc / (StgFloat) total_alloc * 100),
ccs->sub_scc_count, ccs->sub_cafcc_count);
total_prof_ticks == 0 ? 0.0 : (ccs->inherited_ticks / (StgFloat) total_prof_ticks * 100),
total_alloc == 0 ? 0.0 : (ccs->inherited_alloc / (StgFloat) total_alloc * 100)
);
if (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE) {
fprintf(prof_file, " %5ld %9ld", ccs->time_ticks, ccs->mem_alloc*sizeof(W_));
#if defined(PROFILING_DETAIL_COUNTS)
......@@ -758,6 +742,28 @@ count_ticks(CostCentreStack *ccs)
}
}
/* Traverse the cost centre stack tree and inherit ticks & allocs.
*/
static void
inherit_costs(CostCentreStack *ccs)
{
IndexTable *i;
if (ccs_to_ignore(ccs)) { return; }
ccs->inherited_ticks += ccs->time_ticks;
ccs->inherited_alloc += ccs->mem_alloc;
for (i = ccs->indexTable; i != NULL; i = i->next)
if (!i->back_edge) {
inherit_costs(i->ccs);
ccs->inherited_ticks += i->ccs->inherited_ticks;
ccs->inherited_alloc += i->ccs->inherited_alloc;
}
return;
}
/* return rtsTrue if it is one of the ones that
* should not be reported normally (because it confuses
* the users)
......@@ -797,17 +803,11 @@ pruneCCSTree( CostCentreStack *ccs )
/* force printing of *all* cost centres if -P -P */ )
|| ( ccs->indexTable != 0 )
|| ( (ccs->scc_count || ccs->sub_scc_count ||
ccs->time_ticks || ccs->mem_alloc
|| (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE
&& (ccs->sub_cafcc_count
#if defined(PROFILING_DETAIL_COUNTS)
|| cc->thunk_count || cc->function_count || cc->pap_count
#endif
))))) {
return ccs;
|| ( ccs->scc_count || ccs->time_ticks || ccs->mem_alloc )
) {
return ccs;
} else {
return NULL;
return NULL;
}
}
......@@ -847,6 +847,27 @@ reportCCS_XML(CostCentreStack *ccs)
}
}
void
print_ccs (FILE *fp, CostCentreStack *ccs)
{
if (ccs == CCCS) {
fprintf(fp, "Cost-Centre Stack: ");
}
if (ccs != CCS_MAIN)
{
print_ccs(fp, ccs->prevStack);
fprintf(fp, "->[%s,%s]", ccs->cc->label, ccs->cc->module);
} else {
fprintf(fp, "[%s,%s]", ccs->cc->label, ccs->cc->module);
}
if (ccs == CCCS) {
fprintf(fp, "\n");
}
}
#ifdef DEBUG
static void
printCCS ( CostCentreStack *ccs )
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment