[project @ 2000-05-12 13:01:04 by simonmar]
authorsimonmar <unknown>
Fri, 12 May 2000 13:01:04 +0000 (13:01 +0000)
committersimonmar <unknown>
Fri, 12 May 2000 13:01:04 +0000 (13:01 +0000)
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).

ghc/includes/StgProf.h
ghc/rts/Profiling.c

index b2783ef..f19f4d2 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $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 */                      \
index fe2c6e8..b40b298 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $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 )