From 8fb3697916ec2a58a63bbcee65cb1bf37253a8cd Mon Sep 17 00:00:00 2001 From: aaronp64 Date: Mon, 12 May 2025 11:42:41 -0400 Subject: [PATCH] Avoid single character String allocations when appending characters Removed calls to String::chr() when appending characters to Strings in Expression, Resource, and VariantParser, to avoid creating temporary Strings for each character. Also updated the Resource case to resize String up front, since size is known. --- core/io/resource.cpp | 7 +++++-- core/math/expression.cpp | 4 ++-- core/variant/variant_parser.cpp | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/core/io/resource.cpp b/core/io/resource.cpp index fac829d9cb4..5b76b6a5447 100644 --- a/core/io/resource.cpp +++ b/core/io/resource.cpp @@ -142,15 +142,18 @@ String Resource::generate_scene_unique_id() { static constexpr uint32_t char_count = ('z' - 'a'); static constexpr uint32_t base = char_count + ('9' - '0'); String id; + id.resize(characters + 1); + char32_t *ptr = id.ptrw(); for (uint32_t i = 0; i < characters; i++) { uint32_t c = random_num % base; if (c < char_count) { - id += String::chr('a' + c); + ptr[i] = ('a' + c); } else { - id += String::chr('0' + (c - char_count)); + ptr[i] = ('0' + (c - char_count)); } random_num /= base; } + ptr[characters] = '\0'; return id; } diff --git a/core/math/expression.cpp b/core/math/expression.cpp index 0bfc8def8e2..17830394422 100644 --- a/core/math/expression.cpp +++ b/core/math/expression.cpp @@ -408,7 +408,7 @@ Error Expression::_get_token(Token &r_token) { if (reading == READING_DONE) { break; } - num += String::chr(c); + num += c; c = GET_CHAR(); is_first_char = false; } @@ -435,7 +435,7 @@ Error Expression::_get_token(Token &r_token) { cchar = GET_CHAR(); while (is_unicode_identifier_continue(cchar)) { - id += String::chr(cchar); + id += cchar; cchar = GET_CHAR(); } diff --git a/core/variant/variant_parser.cpp b/core/variant/variant_parser.cpp index 7f6b9f9689a..5631f6d242d 100644 --- a/core/variant/variant_parser.cpp +++ b/core/variant/variant_parser.cpp @@ -1757,7 +1757,7 @@ Error VariantParser::_parse_tag(Token &token, Stream *p_stream, int &line, Strin } else { escaping = false; } - r_tag.name += String::chr(c); + r_tag.name += c; } } @@ -1902,7 +1902,7 @@ Error VariantParser::parse_tag_assign_eof(Stream *p_stream, int &line, String &r what = tk.value; } else if (c != '=') { - what += String::chr(c); + what += c; } else { r_assign = what; Token token;