Remove MIN_PRE_ALLOC_SIZE from Strings.

This optimisation is no longer helpful now that we use VWA to allocate
strings in larger size pools where they can be embedded.
This commit is contained in:
Matt Valentine-House 2023-01-10 17:58:45 +00:00 committed by Peter Zhu
parent fc7f852033
commit bb5fddd070
Notes: git 2023-01-13 15:32:06 +00:00
2 changed files with 25 additions and 13 deletions

View File

@ -3340,28 +3340,19 @@ rb_str_append(VALUE str, VALUE str2)
return rb_str_buf_append(str, str2);
}
#define MIN_PRE_ALLOC_SIZE 48
MJIT_FUNC_EXPORTED VALUE
rb_str_concat_literals(size_t num, const VALUE *strary)
{
VALUE str;
size_t i, s;
long len = 1;
size_t i, s = 0;
unsigned long len = 1;
if (UNLIKELY(!num)) return rb_str_new(0, 0);
if (UNLIKELY(num == 1)) return rb_str_resurrect(strary[0]);
for (i = 0; i < num; ++i) { len += RSTRING_LEN(strary[i]); }
if (LIKELY(len < MIN_PRE_ALLOC_SIZE)) {
str = rb_str_resurrect(strary[0]);
s = 1;
}
else {
str = rb_str_buf_new(len);
rb_enc_copy(str, strary[0]);
s = 0;
}
str = rb_str_buf_new(len);
str_enc_copy(str, strary[0]);
for (i = s; i < num; ++i) {
const VALUE v = strary[i];

View File

@ -661,6 +661,27 @@ CODE
assert_equal(Encoding::UTF_8, "#{s}x".encoding)
end
def test_string_interpolations_across_size_pools_get_embedded
omit if GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] == 1
require 'objspace'
base_slot_size = GC::INTERNAL_CONSTANTS[:BASE_SLOT_SIZE]
small_obj_size = (base_slot_size / 2)
large_obj_size = base_slot_size * 2
a = "a" * small_obj_size
b = "a" * large_obj_size
res = "#{a}, #{b}"
dump_res = ObjectSpace.dump(res)
dump_orig = ObjectSpace.dump(a)
new_slot_size = Integer(dump_res.match(/"slot_size":(\d+)/)[1])
orig_slot_size = Integer(dump_orig.match(/"slot_size":(\d+)/)[1])
assert_match(/"embedded":true/, dump_res)
assert_operator(new_slot_size, :>, orig_slot_size)
end
def test_count
a = S("hello world")
assert_equal(5, a.count(S("lo")))