diff options
author | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-06-05 15:57:12 +0000 |
---|---|---|
committer | tarui <tarui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-06-05 15:57:12 +0000 |
commit | 5d10f35142762ecfdf9a7996eb31217d13c0f251 (patch) | |
tree | fd644b67ae8e69fc8df257d3e68a907e2bbf4b74 | |
parent | 6e4cfd9475e4287df2e9cd5bfdad6bd82aaaacd6 (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-- | ChangeLog | 5 | ||||
-rw-r--r-- | gc.c | 45 |
2 files changed, 30 insertions, 20 deletions
@@ -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. @@ -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++; } } |