Hi Han-Wen,

Thanks for your input!

Han-Wen Nienhuys <[EMAIL PROTECTED]> writes:

> the easiest way is to modify
>
>   scm_gc_for_newcell()
>
>
> so it directly passes to the
>
>   scm_i_get_new_heap_segment (freelist, abort_on_error);
>
> case

No, that won't have any impact because this very case is rarely
reached.

I checked this by adding two (static) counters to `scm_gc_for_newcell ()':
one that counts the number of calls, and one that counts the number of
non-EOL returns of the first `scm_i_sweep_some_segments ()' call.  The
ratio (still for the same workload) is _always_ very, very close to 1.

This is because `scm_i_sweep_some_segments ()' does not actually only
sweep segments: it sometimes (actually here, most of the time)
*initializes* them.  The reason is that it uses `scm_i_sweep_some_cards ()'
which in turn chooses whether to initialize or sweep depending on
whether the segment at hand is already initialized (SWEEPER is chosen
based on SEG->FIRST_TIME).

This interleaving of initialization and sweeping makes it pretty hard to
track exactly where fresh cells come from.  I guess one solution might
be to maintain a list of the uninitialized segments and pick cells
directly from there before actually sweeping.

To be continued...  Hopefully!  ;-)

Thanks,
Ludovic.


_______________________________________________
Guile-devel mailing list
Guile-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/guile-devel

Reply via email to