static Ticks ExitUserTime = 0;
static Ticks ExitElapsedTime = 0;
-static ullong GC_tot_alloc = 0;
-static ullong GC_tot_copied = 0;
+static StgWord64 GC_tot_alloc = 0;
+static StgWord64 GC_tot_copied = 0;
-static ullong GC_par_max_copied = 0;
-static ullong GC_par_avg_copied = 0;
+static StgWord64 GC_par_max_copied = 0;
+static StgWord64 GC_par_avg_copied = 0;
static Ticks GC_start_time = 0, GC_tot_time = 0; /* User GC Time */
static Ticks GCe_start_time = 0, GCe_tot_time = 0; /* Elapsed GC time */
PROF_VAL(RPe_tot_time + HCe_tot_time) - InitElapsedStamp;
if (MutElapsedTime < 0) { MutElapsedTime = 0; } /* sometimes -0.00 */
- MutUserTime = user - GC_tot_time - PROF_VAL(RP_tot_time + HC_tot_time) - InitUserTime;
+ MutUserTime = user - GC_tot_time -
+ PROF_VAL(RP_tot_time + HC_tot_time) - InitUserTime;
if (MutUserTime < 0) { MutUserTime = 0; }
#if USE_PAPI
}
}
-#if defined(PROFILING) || defined(DEBUG)
- GC_start_time = getProcessCPUTime(); // needed in mut_user_time_during_GC()
-#endif
-
- if (RtsFlags.GcFlags.giveStats != NO_GC_STATS) {
-#if !defined(PROFILING) && !defined(DEBUG)
- GC_start_time = getProcessCPUTime();
-#endif
- GCe_start_time = getProcessElapsedTime();
+ if (RtsFlags.GcFlags.giveStats != NO_GC_STATS
+ || RtsFlags.ProfFlags.doHeapProfile)
+ // heap profiling needs GC_tot_time
+ {
+ getProcessTimes(&GC_start_time, &GCe_start_time);
if (RtsFlags.GcFlags.giveStats) {
GC_start_faults = getPageFaults();
}
stat_endGC (lnat alloc, lnat live, lnat copied, lnat gen,
lnat max_copied, lnat avg_copied, lnat slop)
{
- if (RtsFlags.GcFlags.giveStats != NO_GC_STATS) {
+ if (RtsFlags.GcFlags.giveStats != NO_GC_STATS ||
+ RtsFlags.ProfFlags.doHeapProfile)
+ // heap profiling needs GC_tot_time
+ {
Ticks time, etime, gc_time, gc_etime;
getProcessTimes(&time, &etime);
GC_coll_times[gen] += gc_time;
GC_coll_etimes[gen] += gc_etime;
- GC_tot_copied += (ullong) copied;
- GC_tot_alloc += (ullong) alloc;
- GC_par_max_copied += (ullong) max_copied;
- GC_par_avg_copied += (ullong) avg_copied;
+ GC_tot_copied += (StgWord64) copied;
+ GC_tot_alloc += (StgWord64) alloc;
+ GC_par_max_copied += (StgWord64) max_copied;
+ GC_par_avg_copied += (StgWord64) avg_copied;
GC_tot_time += gc_time;
GCe_tot_time += gc_etime;
/* Report the value of a counter */
#define REPORT(counter) \
{ \
- ullong_format_string(counter,temp,rtsTrue/*commas*/); \
+ showStgWord64(counter,temp,rtsTrue/*commas*/); \
statsPrintf(" (" #counter ") : %s\n",temp); \
}
}
if (RtsFlags.GcFlags.giveStats >= SUMMARY_GC_STATS) {
- ullong_format_string(GC_tot_alloc*sizeof(W_),
+ showStgWord64(GC_tot_alloc*sizeof(W_),
temp, rtsTrue/*commas*/);
statsPrintf("%16s bytes allocated in the heap\n", temp);
- ullong_format_string(GC_tot_copied*sizeof(W_),
+ showStgWord64(GC_tot_copied*sizeof(W_),
temp, rtsTrue/*commas*/);
statsPrintf("%16s bytes copied during GC\n", temp);
if ( ResidencySamples > 0 ) {
- ullong_format_string(MaxResidency*sizeof(W_),
+ showStgWord64(MaxResidency*sizeof(W_),
temp, rtsTrue/*commas*/);
statsPrintf("%16s bytes maximum residency (%ld sample(s))\n",
temp, ResidencySamples);
}
- ullong_format_string(MaxSlop*sizeof(W_), temp, rtsTrue/*commas*/);
+ showStgWord64(MaxSlop*sizeof(W_), temp, rtsTrue/*commas*/);
statsPrintf("%16s bytes maximum slop\n", temp);
statsPrintf("%16ld MB total memory in use (%ld MB lost due to fragmentation)\n\n",
- mblocks_allocated * MBLOCK_SIZE_W / (1024 * 1024 / sizeof(W_)),
- (mblocks_allocated * MBLOCK_SIZE_W - hw_alloc_blocks * BLOCK_SIZE_W) / (1024 * 1024 / sizeof(W_)));
+ peak_mblocks_allocated * MBLOCK_SIZE_W / (1024 * 1024 / sizeof(W_)),
+ (peak_mblocks_allocated * BLOCKS_PER_MBLOCK * BLOCK_SIZE_W - hw_alloc_blocks * BLOCK_SIZE_W) / (1024 * 1024 / sizeof(W_)));
/* Print garbage collections in each gen */
for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
TICK_TO_DBL(GCe_tot_time)*100/TICK_TO_DBL(etime));
if (time - GC_tot_time - PROF_VAL(RP_tot_time + HC_tot_time) == 0)
- ullong_format_string(0, temp, rtsTrue/*commas*/);
+ showStgWord64(0, temp, rtsTrue/*commas*/);
else
- ullong_format_string(
- (ullong)((GC_tot_alloc*sizeof(W_))/
+ showStgWord64(
+ (StgWord64)((GC_tot_alloc*sizeof(W_))/
TICK_TO_DBL(time - GC_tot_time -
PROF_VAL(RP_tot_time + HC_tot_time))),
temp, rtsTrue/*commas*/);
fmt2 = "%d GCs, %ld/%ld avg/max bytes residency (%ld samples), %luM in use, %.2f INIT (%.2f elapsed), %.2f MUT (%.2f elapsed), %.2f GC (%.2f elapsed) :ghc>>\n";
}
/* print the long long separately to avoid bugginess on mingwin (2001-07-02, mingw-0.5) */
- statsPrintf(fmt1, GC_tot_alloc*(ullong)sizeof(W_));
+ statsPrintf(fmt1, GC_tot_alloc*(StgWord64)sizeof(W_));
statsPrintf(fmt2,
total_collections,
ResidencySamples == 0 ? 0 :
AvgResidency*sizeof(W_)/ResidencySamples,
MaxResidency*sizeof(W_),
ResidencySamples,
- (unsigned long)(mblocks_allocated * MBLOCK_SIZE / (1024L * 1024L)),
+ (unsigned long)(peak_mblocks_allocated * MBLOCK_SIZE / (1024L * 1024L)),
TICK_TO_DBL(InitUserTime), TICK_TO_DBL(InitElapsedTime),
TICK_TO_DBL(MutUserTime), TICK_TO_DBL(MutElapsedTime),
TICK_TO_DBL(GC_tot_time), TICK_TO_DBL(GCe_tot_time));