[前][次][番号順一覧][スレッド一覧]

ruby-changes:58887

From: John <ko1@a...>
Date: Sat, 23 Nov 2019 05:42:57 +0900 (JST)
Subject: [ruby-changes:58887] 26fd8d962c (master): Optimize pinned page sorting

https://git.ruby-lang.org/ruby.git/commit/?id=26fd8d962c

From 26fd8d962ce42b7eb8d1c1eb43ddfa1ff24dc3aa Mon Sep 17 00:00:00 2001
From: John Hawthorn <john@h...>
Date: Wed, 20 Nov 2019 14:18:40 -0800
Subject: Optimize pinned page sorting

Previously we would count the pinned objects on each comparison. Since
sorting is O(N log N) and we calculated this on both left and right
pages on each comparison this resulted in a extra iterations over the
slots.

diff --git a/gc.c b/gc.c
index 9329f31..d2b4330 100644
--- a/gc.c
+++ b/gc.c
@@ -844,6 +844,7 @@ enum { https://github.com/ruby/ruby/blob/trunk/gc.c#L844
 struct heap_page {
     short total_slots;
     short free_slots;
+    short pinned_slots;
     short final_slots;
     struct {
 	unsigned int before_sweep : 1;
@@ -7731,9 +7732,13 @@ count_pinned(struct heap_page *page) https://github.com/ruby/ruby/blob/trunk/gc.c#L7732
 static int
 compare_pinned(const void *left, const void *right, void *dummy)
 {
-    int left_count = count_pinned(*(struct heap_page * const *)left);
-    int right_count = count_pinned(*(struct heap_page * const *)right);
-    return right_count - left_count;
+    struct heap_page *left_page;
+    struct heap_page *right_page;
+
+    left_page = *(struct heap_page * const *)left;
+    right_page = *(struct heap_page * const *)right;
+
+    return right_page->pinned_slots - left_page->pinned_slots;
 }
 
 static int
@@ -7760,6 +7765,7 @@ allocate_page_list(rb_objspace_t *objspace, page_compare_func_t *comparator) https://github.com/ruby/ruby/blob/trunk/gc.c#L7765
 
     list_for_each(&heap_eden->pages, page, page_node) {
         page_list[i++] = page;
+        page->pinned_slots = count_pinned(page);
         GC_ASSERT(page != NULL);
     }
     GC_ASSERT(total_pages > 0);
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]