From 4f9caea891cde5e2edb62daa52f0a9dce955f6c9 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 11 Feb 2023 16:13:33 +0900 Subject: [PATCH] range.c (range_num_to_a): add array entries directly Calling `mrb_ary_push()` is slower. --- src/range.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/range.c b/src/range.c index a81bcd428..84855cfcf 100644 --- a/src/range.c +++ b/src/range.c @@ -370,8 +370,10 @@ range_num_to_a(mrb_state *mrb, mrb_value range) len++; } ary = mrb_ary_new_capa(mrb, len); + mrb_value *ptr = RARRAY_PTR(ary); for (mrb_int i=0; i b) { + return mrb_ary_new_capa(mrb, 0); + } ary = mrb_ary_new_capa(mrb, (mrb_int)(b - a) + 1); + mrb_value *ptr = RARRAY_PTR(ary); + mrb_int i = 0; if (RANGE_EXCL(r)) { while (a < b) { - mrb_ary_push(mrb, ary, mrb_int_value(mrb, (mrb_int)a)); + ptr[i++] = mrb_int_value(mrb, (mrb_int)a); + ARY_SET_LEN(RARRAY(ary), i); a += 1.0; } } else { while (a <= b) { - mrb_ary_push(mrb, ary, mrb_int_value(mrb, (mrb_int)a)); + ptr[i++] = mrb_int_value(mrb, (mrb_int)a); + ARY_SET_LEN(RARRAY(ary), i); a += 1.0; } }