1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-17 03:00:21 +02:00

* gc.c (scm_gc_stats): add more obscure stats, such as: mark time,

sweep time, total marked cells, total swept cells, and number of
times GC was invoked.
(gc_start_stats): renamed from scm_gc_start, made static, taught
to init the new stats.
(gc_end_stats): renamed from scm_gc_end, made static, taught to
calculate the new stats.
(scm_igc): don't call gc_start_stats unless we are sure that we
are indeed going to collect.  also, added some timekeeping between
the mark and sweep phases.
(scm_gc_sweep): count number of cells we sweep as we go.

* gc.h: removed prototypes for scm_gc_{start,end}.
This commit is contained in:
Michael Livshin 2000-08-16 00:23:18 +00:00
parent d6f3775530
commit c9b0d4b090
2 changed files with 50 additions and 14 deletions

View file

@ -332,8 +332,15 @@ unsigned long scm_gc_yield;
static unsigned long scm_gc_yield_1 = 0; /* previous GC yield */ static unsigned long scm_gc_yield_1 = 0; /* previous GC yield */
unsigned long scm_gc_malloc_collected; unsigned long scm_gc_malloc_collected;
unsigned long scm_gc_ports_collected; unsigned long scm_gc_ports_collected;
unsigned long scm_gc_rt;
unsigned long scm_gc_time_taken = 0; unsigned long scm_gc_time_taken = 0;
static unsigned long t_before_gc;
static unsigned long t_before_sweep;
unsigned long scm_gc_mark_time_taken = 0;
unsigned long scm_gc_sweep_time_taken = 0;
unsigned long scm_gc_times = 0;
unsigned long scm_gc_cells_swept = 0;
double scm_gc_cells_marked_acc = 0.;
double scm_gc_cells_swept_acc = 0.;
SCM_SYMBOL (sym_cells_allocated, "cells-allocated"); SCM_SYMBOL (sym_cells_allocated, "cells-allocated");
SCM_SYMBOL (sym_heap_size, "cell-heap-size"); SCM_SYMBOL (sym_heap_size, "cell-heap-size");
@ -341,6 +348,11 @@ SCM_SYMBOL (sym_mallocated, "bytes-malloced");
SCM_SYMBOL (sym_mtrigger, "gc-malloc-threshold"); SCM_SYMBOL (sym_mtrigger, "gc-malloc-threshold");
SCM_SYMBOL (sym_heap_segments, "cell-heap-segments"); SCM_SYMBOL (sym_heap_segments, "cell-heap-segments");
SCM_SYMBOL (sym_gc_time_taken, "gc-time-taken"); SCM_SYMBOL (sym_gc_time_taken, "gc-time-taken");
SCM_SYMBOL (sym_gc_mark_time_taken, "gc-mark-time-taken");
SCM_SYMBOL (sym_gc_sweep_time_taken, "gc-sweep-time-taken");
SCM_SYMBOL (sym_times, "gc-times");
SCM_SYMBOL (sym_cells_marked, "cells-marked");
SCM_SYMBOL (sym_cells_swept, "cells-swept");
typedef struct scm_heap_seg_data_t typedef struct scm_heap_seg_data_t
{ {
@ -641,6 +653,11 @@ SCM_DEFINE (scm_gc_stats, "gc-stats", 0, 0, 0,
long int local_scm_heap_size; long int local_scm_heap_size;
long int local_scm_cells_allocated; long int local_scm_cells_allocated;
long int local_scm_gc_time_taken; long int local_scm_gc_time_taken;
long int local_scm_gc_times;
long int local_scm_gc_mark_time_taken;
long int local_scm_gc_sweep_time_taken;
double local_scm_gc_cells_swept;
double local_scm_gc_cells_marked;
SCM answer; SCM answer;
SCM_DEFER_INTS; SCM_DEFER_INTS;
@ -667,12 +684,22 @@ SCM_DEFINE (scm_gc_stats, "gc-stats", 0, 0, 0,
local_scm_heap_size = SCM_HEAP_SIZE; local_scm_heap_size = SCM_HEAP_SIZE;
local_scm_cells_allocated = compute_cells_allocated (); local_scm_cells_allocated = compute_cells_allocated ();
local_scm_gc_time_taken = scm_gc_time_taken; local_scm_gc_time_taken = scm_gc_time_taken;
local_scm_gc_mark_time_taken = scm_gc_mark_time_taken;
local_scm_gc_sweep_time_taken = scm_gc_sweep_time_taken;
local_scm_gc_times = scm_gc_times;
local_scm_gc_cells_swept = scm_gc_cells_swept_acc;
local_scm_gc_cells_marked = scm_gc_cells_marked_acc;
answer = scm_listify (scm_cons (sym_gc_time_taken, scm_ulong2num (local_scm_gc_time_taken)), answer = scm_listify (scm_cons (sym_gc_time_taken, scm_ulong2num (local_scm_gc_time_taken)),
scm_cons (sym_cells_allocated, scm_ulong2num (local_scm_cells_allocated)), scm_cons (sym_cells_allocated, scm_ulong2num (local_scm_cells_allocated)),
scm_cons (sym_heap_size, scm_ulong2num (local_scm_heap_size)), scm_cons (sym_heap_size, scm_ulong2num (local_scm_heap_size)),
scm_cons (sym_mallocated, scm_ulong2num (local_scm_mallocated)), scm_cons (sym_mallocated, scm_ulong2num (local_scm_mallocated)),
scm_cons (sym_mtrigger, scm_ulong2num (local_scm_mtrigger)), scm_cons (sym_mtrigger, scm_ulong2num (local_scm_mtrigger)),
scm_cons (sym_times, scm_ulong2num (local_scm_gc_times)),
scm_cons (sym_gc_mark_time_taken, scm_ulong2num (local_scm_gc_mark_time_taken)),
scm_cons (sym_gc_sweep_time_taken, scm_ulong2num (local_scm_gc_sweep_time_taken)),
scm_cons (sym_cells_marked, scm_dbl2big (local_scm_gc_cells_marked)),
scm_cons (sym_cells_swept, scm_dbl2big (local_scm_gc_cells_swept)),
scm_cons (sym_heap_segments, heap_segs), scm_cons (sym_heap_segments, heap_segs),
SCM_UNDEFINED); SCM_UNDEFINED);
SCM_ALLOW_INTS; SCM_ALLOW_INTS;
@ -681,10 +708,11 @@ SCM_DEFINE (scm_gc_stats, "gc-stats", 0, 0, 0,
#undef FUNC_NAME #undef FUNC_NAME
void static void
scm_gc_start (const char *what) gc_start_stats (const char *what)
{ {
scm_gc_rt = SCM_INUM (scm_get_internal_run_time ()); t_before_gc = scm_c_get_internal_run_time ();
scm_gc_cells_swept = 0;
scm_gc_cells_collected = 0; scm_gc_cells_collected = 0;
scm_gc_yield_1 = scm_gc_yield; scm_gc_yield_1 = scm_gc_yield;
scm_gc_yield = (scm_cells_allocated scm_gc_yield = (scm_cells_allocated
@ -695,11 +723,16 @@ scm_gc_start (const char *what)
} }
void static void
scm_gc_end () gc_end_stats ()
{ {
scm_gc_rt = SCM_INUM (scm_get_internal_run_time ()) - scm_gc_rt; unsigned long t = scm_c_get_internal_run_time ();
scm_gc_time_taken += scm_gc_rt; scm_gc_time_taken += (t - t_before_gc);
scm_gc_sweep_time_taken += (t - t_before_sweep);
++scm_gc_times;
scm_gc_cells_marked_acc += scm_gc_cells_swept - scm_gc_cells_collected;
scm_gc_cells_swept_acc += scm_gc_cells_swept;
} }
@ -867,15 +900,14 @@ scm_igc (const char *what)
/* fprintf (stderr, "gc: %s\n", what); */ /* fprintf (stderr, "gc: %s\n", what); */
scm_gc_start (what);
if (!scm_stack_base || scm_block_gc) if (!scm_stack_base || scm_block_gc)
{ {
scm_gc_end ();
--scm_gc_running_p; --scm_gc_running_p;
return; return;
} }
gc_start_stats (what);
if (scm_mallocated < 0) if (scm_mallocated < 0)
/* The byte count of allocated objects has underflowed. This is /* The byte count of allocated objects has underflowed. This is
probably because you forgot to report the sizes of objects you probably because you forgot to report the sizes of objects you
@ -959,6 +991,9 @@ scm_igc (const char *what)
scm_gc_mark (scm_root->handle); scm_gc_mark (scm_root->handle);
#endif #endif
t_before_sweep = scm_c_get_internal_run_time ();
scm_gc_mark_time_taken += (t_before_sweep - t_before_gc);
scm_c_hook_run (&scm_before_sweep_c_hook, 0); scm_c_hook_run (&scm_before_sweep_c_hook, 0);
scm_gc_sweep (); scm_gc_sweep ();
@ -966,7 +1001,7 @@ scm_igc (const char *what)
scm_c_hook_run (&scm_after_sweep_c_hook, 0); scm_c_hook_run (&scm_after_sweep_c_hook, 0);
--scm_gc_heap_lock; --scm_gc_heap_lock;
scm_gc_end (); gc_end_stats ();
#ifdef USE_THREADS #ifdef USE_THREADS
SCM_THREAD_CRITICAL_SECTION_END; SCM_THREAD_CRITICAL_SECTION_END;
@ -1452,6 +1487,9 @@ scm_gc_sweep ()
ptr = CELL_UP (scm_heap_table[i].bounds[0], span); ptr = CELL_UP (scm_heap_table[i].bounds[0], span);
seg_size = CELL_DN (scm_heap_table[i].bounds[1], span) - ptr; seg_size = CELL_DN (scm_heap_table[i].bounds[1], span) - ptr;
scm_gc_cells_swept += seg_size;
for (j = seg_size + span; j -= span; ptr += span) for (j = seg_size + span; j -= span; ptr += span)
{ {
SCM scmptr = PTR2SCM (ptr); SCM scmptr = PTR2SCM (ptr);

View file

@ -266,8 +266,6 @@ extern SCM scm_gc_set_debug_check_freelist_x (SCM flag);
extern SCM scm_object_address (SCM obj); extern SCM scm_object_address (SCM obj);
extern SCM scm_unhash_name (SCM name); extern SCM scm_unhash_name (SCM name);
extern SCM scm_gc_stats (void); extern SCM scm_gc_stats (void);
extern void scm_gc_start (const char *what);
extern void scm_gc_end (void);
extern SCM scm_gc (void); extern SCM scm_gc (void);
extern void scm_gc_for_alloc (struct scm_freelist_t *freelist); extern void scm_gc_for_alloc (struct scm_freelist_t *freelist);
extern SCM scm_gc_for_newcell (struct scm_freelist_t *master, SCM *freelist); extern SCM scm_gc_for_newcell (struct scm_freelist_t *master, SCM *freelist);