1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 21:48:13 +00:00

LibJS: Keep track of PrimitiveStrings and share them

VM now has a string cache which tracks all live PrimitiveStrings and
reuses an existing one if possible. This drastically reduces the number
of GC-allocated strings in many real-word situations.
This commit is contained in:
Andreas Kling 2021-10-02 01:36:57 +02:00
parent ba6e4c7ae1
commit f290c59dd8
3 changed files with 13 additions and 1 deletions

View file

@ -25,6 +25,7 @@ PrimitiveString::PrimitiveString(Utf16String string)
PrimitiveString::~PrimitiveString()
{
vm().string_cache().remove(m_utf8_string);
}
String const& PrimitiveString::string() const
@ -90,7 +91,14 @@ PrimitiveString* js_string(Heap& heap, String string)
return &heap.vm().single_ascii_character_string(ch);
}
return heap.allocate_without_global_object<PrimitiveString>(move(string));
auto& string_cache = heap.vm().string_cache();
auto it = string_cache.find(string);
if (it == string_cache.end()) {
auto* new_string = heap.allocate_without_global_object<PrimitiveString>(string);
string_cache.set(move(string), new_string);
return new_string;
}
return it->value;
}
PrimitiveString* js_string(VM& vm, String string)