wingo pushed a commit to branch wip-whippet
in repository guile.

commit 09d2df162645a1ec98d7ee9b3b66cebada5b7e88
Author: Andy Wingo <wi...@igalia.com>
AuthorDate: Mon Jul 18 14:22:23 2022 +0200

    Compute GC yield as fraction of total heap size
---
 large-object-space.h |  5 ++++-
 whippet.h            | 15 +++++++++++++--
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/large-object-space.h b/large-object-space.h
index cf5be0b29..c708641fb 100644
--- a/large-object-space.h
+++ b/large-object-space.h
@@ -29,6 +29,7 @@ struct large_object_space {
   size_t total_pages;
   size_t free_pages;
   size_t live_pages_at_last_collection;
+  size_t pages_freed_by_last_collection;
 
   struct address_set from_space;
   struct address_set to_space;
@@ -125,7 +126,9 @@ static void large_object_space_finish_gc(struct 
large_object_space *space) {
   address_set_for_each(&space->from_space, large_object_space_reclaim_one,
                        space);
   address_set_clear(&space->from_space);
-  space->free_pages = space->total_pages - 
space->live_pages_at_last_collection;
+  size_t free_pages = space->total_pages - 
space->live_pages_at_last_collection;
+  space->pages_freed_by_last_collection = free_pages - space->free_pages;
+  space->free_pages = free_pages;
   pthread_mutex_unlock(&space->lock);
 }
 
diff --git a/whippet.h b/whippet.h
index 56eee50ed..cce3f3090 100644
--- a/whippet.h
+++ b/whippet.h
@@ -773,6 +773,18 @@ static int maybe_grow_heap(struct heap *heap, enum 
gc_reason reason) {
   return 0;
 }
 
+static double heap_last_gc_yield(struct heap *heap) {
+  struct mark_space *mark_space = heap_mark_space(heap);
+  size_t mark_space_yield = mark_space->granules_freed_by_last_collection;
+  mark_space_yield <<= GRANULE_SIZE_LOG_2;
+  struct large_object_space *lospace = heap_large_object_space(heap);
+  size_t lospace_yield = lospace->pages_freed_by_last_collection;
+  lospace_yield <<= lospace->page_size_log2;
+
+  double yield = mark_space_yield + lospace_yield;
+  return yield / heap->size;
+}
+
 static double heap_fragmentation(struct heap *heap) {
   struct mark_space *mark_space = heap_mark_space(heap);
   size_t mark_space_blocks = mark_space->nslabs * NONMETA_BLOCKS_PER_SLAB;
@@ -811,9 +823,8 @@ static void collect(struct mutator *mut, enum gc_reason 
reason) {
   trace_mutator_roots_with_lock_before_stop(mut);
   finish_sweeping(mut);
   wait_for_mutators_to_stop(heap);
-  double yield = space->granules_freed_by_last_collection * GRANULE_SIZE;
+  double yield = heap_last_gc_yield(heap);
   double fragmentation = heap_fragmentation(heap);
-  yield /= SLAB_SIZE * space->nslabs;
   fprintf(stderr, "last gc yield: %f; fragmentation: %f\n", yield, 
fragmentation);
   trace_mutator_roots_after_stop(heap);
   trace_global_roots(heap);

Reply via email to