From 9d298b9dab831f966ea4bf365c712161118dd631 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Wed, 26 Jun 2019 09:52:30 -0700 Subject: Allow Array#join to allocate smaller strings rb_str_buf_new always allocates at least 127 bytes of capacity, even when less is requested. > ObjectSpace.dump(%w[a b c].join) {"address":"0x7f935f06ebf0", "type":"STRING", "class":"0x7f935d8b7bb0", "bytesize":3, "capacity":127, "value":"abc", "encoding":"UTF-8", "memsize":168, "flags":{"wb_protected":true}} Instead, by using rb_str_new and then setting the length to 0, we can allocate the exact amount of memory needed, without extra capacity. > ObjectSpace.dump(%w[a b c].join) {"address":"0x7f903fcab530", "type":"STRING", "class":"0x7f903f8b7988", "embedded":true, "bytesize":3, "value":"abc", "encoding":"UTF-8", "memsize":40, "flags":{"wb_protected":true}} --- array.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/array.c b/array.c index adb32811a5..5443268c1a 100644 --- a/array.c +++ b/array.c @@ -2368,7 +2368,9 @@ rb_ary_join(VALUE ary, VALUE sep) len += RSTRING_LEN(tmp); } - result = rb_str_buf_new(len); + result = rb_str_new(0, len); + rb_str_set_len(result, 0); + if (taint) OBJ_TAINT(result); ary_join_0(ary, sep, RARRAY_LEN(ary), result); -- cgit v1.2.3