summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-05 15:57:12 +0000
committertarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-06-05 15:57:12 +0000
commit5d10f35142762ecfdf9a7996eb31217d13c0f251 (patch)
treefd644b67ae8e69fc8df257d3e68a907e2bbf4b74
parent6e4cfd9475e4287df2e9cd5bfdad6bd82aaaacd6 (diff)
* gc.c (rgengc_rememberset_mark): change scan algorithm for performance:
from object's pointer base to bitmap one. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41095 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--gc.c45
2 files changed, 30 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index e85b40b4d59..e7ad0e9762b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Jun 6 00:52:42 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (rgengc_rememberset_mark): change scan algorithm for performance:
+ from object's pointer base to bitmap one.
+
Thu Jun 6 00:30:04 2013 NARUSE, Yui <naruse@ruby-lang.org>
* win32/win32.c (NET_LUID): define it on MinGW32.
diff --git a/gc.c b/gc.c
index 859e8d6ac7a..d3941cbaf22 100644
--- a/gc.c
+++ b/gc.c
@@ -3591,33 +3591,38 @@ rgengc_remembered(rb_objspace_t *objspace, VALUE obj)
static size_t
rgengc_rememberset_mark(rb_objspace_t *objspace)
{
- size_t i;
+ size_t i, j;
size_t shady_object_count = 0;
- RVALUE *p, *pend;
- uintptr_t *bits;
+ RVALUE *p, *offset;
+ uintptr_t *bits, bitset;
for (i=0; i<heaps_used; i++) {
- if (0 /* TODO: optimization - skip it if there are no remembered objects */) {
- continue;
- }
-
- p = objspace->heap.sorted[i]->start; pend = p + objspace->heap.sorted[i]->limit;
+ p = objspace->heap.sorted[i]->start;
bits = GET_HEAP_REMEMBERSET_BITS(p);
- while (p < pend) {
- if (MARKED_IN_BITMAP(bits, p)) {
- gc_mark(objspace, (VALUE)p);
- rgengc_report(2, objspace, "rgengc_rememberset_mark: mark %p (%s)\n", p, obj_type_name((VALUE)p));
-
- if (RVALUE_SUNNY(p)) {
- rgengc_report(2, objspace, "rgengc_rememberset_mark: clear %p (%s)\n", p, obj_type_name((VALUE)p));
- CLEAR_IN_BITMAP(bits, p);
- }
- else {
- shady_object_count++;
+ offset = p - NUM_IN_SLOT(p);
+
+ for(j=0;j< HEAP_BITMAP_LIMIT;j++){
+ if(bits[j]){
+ p = offset + j * (sizeof(uintptr_t) * CHAR_BIT);
+ bitset = bits[j];
+ while (bitset) {
+ if (bitset & 1) {
+ gc_mark(objspace, (VALUE)p);
+ rgengc_report(2, objspace, "rgengc_rememberset_mark: mark %p (%s)\n", p, obj_type_name((VALUE)p));
+
+ if (RVALUE_SUNNY(p)) {
+ rgengc_report(2, objspace, "rgengc_rememberset_mark: clear %p (%s)\n", p, obj_type_name((VALUE)p));
+ CLEAR_IN_BITMAP(bits, p);
+ }
+ else {
+ shady_object_count++;
+ }
+ }
+ p++;
+ bitset>>=1;
}
}
- p++;
}
}