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 /mrbgems/mruby-array-ext/src/array.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 'mrbgems/mruby-array-ext/src/array.c')
| -rw-r--r-- | mrbgems/mruby-array-ext/src/array.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/mrbgems/mruby-array-ext/src/array.c b/mrbgems/mruby-array-ext/src/array.c index 6919186bd..72e5080f1 100644 --- a/mrbgems/mruby-array-ext/src/array.c +++ b/mrbgems/mruby-array-ext/src/array.c @@ -174,7 +174,7 @@ static mrb_value mrb_ary_slice_bang(mrb_state *mrb, mrb_value self) { struct RArray *a = mrb_ary_ptr(self); - mrb_int i, j, k, len; + mrb_int i, j, k, len, alen = ARY_LEN(a); mrb_value index; mrb_value val; mrb_value *ptr; @@ -185,7 +185,7 @@ mrb_ary_slice_bang(mrb_state *mrb, mrb_value self) if (mrb_get_args(mrb, "o|i", &index, &len) == 1) { switch (mrb_type(index)) { case MRB_TT_RANGE: - if (mrb_range_beg_len(mrb, index, &i, &len, a->len, TRUE) == 1) { + if (mrb_range_beg_len(mrb, index, &i, &len, alen, TRUE) == 1) { goto delete_pos_len; } else { @@ -202,25 +202,25 @@ mrb_ary_slice_bang(mrb_state *mrb, mrb_value self) i = mrb_fixnum(index); delete_pos_len: - if (i < 0) i += a->len; - if (i < 0 || a->len < i) return mrb_nil_value(); + if (i < 0) i += alen; + if (i < 0 || alen < i) return mrb_nil_value(); if (len < 0) return mrb_nil_value(); - if (a->len == i) return mrb_ary_new(mrb); - if (len > a->len - i) len = a->len - i; + if (alen == i) return mrb_ary_new(mrb); + if (len > alen - i) len = alen - i; ary = mrb_ary_new_capa(mrb, len); - + ptr = ARY_PTR(a); for (j = i, k = 0; k < len; ++j, ++k) { - mrb_ary_push(mrb, ary, a->ptr[j]); + mrb_ary_push(mrb, ary, ptr[j]); } - ptr = a->ptr + i; - for (j = i; j < a->len - len; ++j) { + ptr += i; + for (j = i; j < alen - len; ++j) { *ptr = *(ptr+len); ++ptr; } - mrb_ary_resize(mrb, self, a->len - len); + mrb_ary_resize(mrb, self, alen - len); return ary; } |
