diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-07-27 12:46:51 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-07-27 16:13:06 +0900 |
| commit | f26d00d9e81b102fababdd9c0d1b886fab30e35a (patch) | |
| tree | 057788919d060adb7d0045ef6a67cd0a7ae63d8f /src/gc.c | |
| parent | 5d44f8582eb2f3011145861692d9ad42975f7a74 (diff) | |
| download | mruby-f26d00d9e81b102fababdd9c0d1b886fab30e35a.tar.gz mruby-f26d00d9e81b102fababdd9c0d1b886fab30e35a.zip | |
Embed small size array elements in the heap.
It reduces the memory consumption and sometimes improve the
performance as well. For example, the consumed memory size
of `bench/bm_ao_render.rb` is reduced from 1.2GB to 1GB, and
its total execution time become 18.795 sec from 22.229 sec.
Diffstat (limited to 'src/gc.c')
| -rw-r--r-- | src/gc.c | 23 |
1 files changed, 13 insertions, 10 deletions
@@ -466,10 +466,13 @@ mrb_gc_unregister(mrb_state *mrb, mrb_value obj) } a = mrb_ary_ptr(table); mrb_ary_modify(mrb, a); - for (i = 0; i < a->len; i++) { - if (mrb_obj_eq(mrb, a->ptr[i], obj)) { - a->len--; - memmove(&a->ptr[i], &a->ptr[i + 1], (a->len - i) * sizeof(a->ptr[i])); + for (i = 0; i < ARY_LEN(a); i++) { + if (mrb_obj_eq(mrb, ARY_PTR(a)[i], obj)) { + mrb_int len = ARY_LEN(a)-1; + mrb_value *ptr = ARY_PTR(a); + + ARY_SET_LEN(a, len); + memmove(&ptr[i], &ptr[i + 1], (len - i) * sizeof(mrb_value)); break; } } @@ -678,8 +681,8 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) struct RArray *a = (struct RArray*)obj; size_t i, e; - for (i=0,e=a->len; i<e; i++) { - mrb_gc_mark_value(mrb, a->ptr[i]); + for (i=0,e=ARY_LEN(a); i<e; i++) { + mrb_gc_mark_value(mrb, ARY_PTR(a)[i]); } } break; @@ -790,9 +793,9 @@ obj_free(mrb_state *mrb, struct RBasic *obj, int end) case MRB_TT_ARRAY: if (ARY_SHARED_P(obj)) - mrb_ary_decref(mrb, ((struct RArray*)obj)->aux.shared); - else - mrb_free(mrb, ((struct RArray*)obj)->ptr); + mrb_ary_decref(mrb, ((struct RArray*)obj)->as.heap.aux.shared); + else if (!ARY_EMBED_P(obj)) + mrb_free(mrb, ((struct RArray*)obj)->as.heap.ptr); break; case MRB_TT_HASH: @@ -950,7 +953,7 @@ gc_gray_mark(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) case MRB_TT_ARRAY: { struct RArray *a = (struct RArray*)obj; - children += a->len; + children += ARY_LEN(a); } break; |
