Improve CowData::insert performance

Update CowData::insert to call ptrw() before loop, to avoid calling _copy_on_write for each item in the array, as well as repeated index checks in set and get.  For larger Vectors/Arrays, this makes inserts around 10x faster for ints, 3x faster for Strings, and 2x faster for Variants.  Less of an impact on smaller Vectors/Arrays, as a larger percentage of the time is spent allocating.
This commit is contained in:
aaronp64 2024-07-13 21:36:11 -04:00
parent 97b8ad1af0
commit c1afe7dcdf
1 changed files with 8 additions and 5 deletions

View File

@ -222,12 +222,15 @@ public:
} }
Error insert(Size p_pos, const T &p_val) { Error insert(Size p_pos, const T &p_val) {
ERR_FAIL_INDEX_V(p_pos, size() + 1, ERR_INVALID_PARAMETER); Size new_size = size() + 1;
resize(size() + 1); ERR_FAIL_INDEX_V(p_pos, new_size, ERR_INVALID_PARAMETER);
for (Size i = (size() - 1); i > p_pos; i--) { Error err = resize(new_size);
set(i, get(i - 1)); ERR_FAIL_COND_V(err, err);
T *p = ptrw();
for (Size i = new_size - 1; i > p_pos; i--) {
p[i] = p[i - 1];
} }
set(p_pos, p_val); p[p_pos] = p_val;
return OK; return OK;
} }