From acab2d6c1c7a31aaba24f759b5259640ec346adb Mon Sep 17 00:00:00 2001 From: Haoyu Qiu Date: Wed, 16 Oct 2024 20:54:56 +0800 Subject: [PATCH] Cache results for `TranslationServer.compare_locales()` --- core/string/translation_server.cpp | 35 +++++++++++++++++++----------- core/string/translation_server.h | 2 ++ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/core/string/translation_server.cpp b/core/string/translation_server.cpp index 89b37d0b8a2f..92b473b61f06 100644 --- a/core/string/translation_server.cpp +++ b/core/string/translation_server.cpp @@ -228,32 +228,41 @@ int TranslationServer::compare_locales(const String &p_locale_a, const String &p return 10; } + const String cache_key = p_locale_a + "|" + p_locale_b; + const int *cached_result = locale_compare_cache.getptr(cache_key); + if (cached_result) { + return *cached_result; + } + String locale_a = _standardize_locale(p_locale_a, true); String locale_b = _standardize_locale(p_locale_b, true); if (locale_a == locale_b) { // Exact match. + locale_compare_cache.insert(cache_key, 10); return 10; } Vector locale_a_elements = locale_a.split("_"); Vector locale_b_elements = locale_b.split("_"); - if (locale_a_elements[0] == locale_b_elements[0]) { - // Matching language, both locales have extra parts. - // Return number of matching elements. - int matching_elements = 1; - for (int i = 1; i < locale_a_elements.size(); i++) { - for (int j = 1; j < locale_b_elements.size(); j++) { - if (locale_a_elements[i] == locale_b_elements[j]) { - matching_elements++; - } - } - } - return matching_elements; - } else { + if (locale_a_elements[0] != locale_b_elements[0]) { // No match. + locale_compare_cache.insert(cache_key, 0); return 0; } + + // Matching language, both locales have extra parts. + // Return number of matching elements. + int matching_elements = 1; + for (int i = 1; i < locale_a_elements.size(); i++) { + for (int j = 1; j < locale_b_elements.size(); j++) { + if (locale_a_elements[i] == locale_b_elements[j]) { + matching_elements++; + } + } + } + locale_compare_cache.insert(cache_key, matching_elements); + return matching_elements; } String TranslationServer::get_locale_name(const String &p_locale) const { diff --git a/core/string/translation_server.h b/core/string/translation_server.h index a09230c0192d..2438349a69b4 100644 --- a/core/string/translation_server.h +++ b/core/string/translation_server.h @@ -46,6 +46,8 @@ class TranslationServer : public Object { Ref doc_domain; HashMap> custom_domains; + mutable HashMap locale_compare_cache; + bool enabled = true; static TranslationServer *singleton;