diff options
author | myaaaaaaaaa <103326468+myaaaaaaaaa@users.noreply.github.com> | 2023-01-29 20:46:55 -0500 |
---|---|---|
committer | myaaaaaaaaa <103326468+myaaaaaaaaa@users.noreply.github.com> | 2023-06-20 08:40:01 -0400 |
commit | 5cc961627de43b592b1c69c5367d7ab9fb43a732 (patch) | |
tree | 686e3226f8d7c73ab046a4ed7461b4e87505afd8 /core/object | |
parent | 668cf3c66f42989949399f36e9faa29426e37416 (diff) | |
download | redot-engine-5cc961627de43b592b1c69c5367d7ab9fb43a732.tar.gz |
Avoid sorting CallableCustomMethodPointers by their actual address values
Diffstat (limited to 'core/object')
-rw-r--r-- | core/object/callable_method_pointer.cpp | 22 |
1 files changed, 6 insertions, 16 deletions
diff --git a/core/object/callable_method_pointer.cpp b/core/object/callable_method_pointer.cpp index b53985e6b7..ed400788b1 100644 --- a/core/object/callable_method_pointer.cpp +++ b/core/object/callable_method_pointer.cpp @@ -38,13 +38,10 @@ bool CallableCustomMethodPointerBase::compare_equal(const CallableCustom *p_a, c return false; } - for (uint32_t i = 0; i < a->comp_size; i++) { - if (a->comp_ptr[i] != b->comp_ptr[i]) { - return false; - } - } - - return true; + // Avoid sorting by memory address proximity, which leads to unpredictable performance over time + // due to the reuse of old addresses for newer objects. Use byte-wise comparison to leverage the + // backwards encoding of little-endian systems as a way to decouple spatiality and time. + return memcmp(a->comp_ptr, b->comp_ptr, a->comp_size * 4) == 0; } bool CallableCustomMethodPointerBase::compare_less(const CallableCustom *p_a, const CallableCustom *p_b) { @@ -55,15 +52,8 @@ bool CallableCustomMethodPointerBase::compare_less(const CallableCustom *p_a, co return a->comp_size < b->comp_size; } - for (uint32_t i = 0; i < a->comp_size; i++) { - if (a->comp_ptr[i] == b->comp_ptr[i]) { - continue; - } - - return a->comp_ptr[i] < b->comp_ptr[i]; - } - - return false; + // See note in compare_equal(). + return memcmp(a->comp_ptr, b->comp_ptr, a->comp_size * 4) < 0; } CallableCustom::CompareEqualFunc CallableCustomMethodPointerBase::get_compare_equal_func() const { |