FCurve: optimize search from an RNA path + index.

By checking the index value first instead of a full fledge string
comparision in `BKE_fcurve_find`, we can make that code significatly
faster (from about 10% in a Heist production file to over 45% in a
heavily animated test file).

While this code was already very fast (a few microseconds per call
typically), it gets called a lot from the UI (several hundreds of time
per refresh), among other things.

NOTE: the `UNLIKELY` hint is responsible for 25% to 30% of the
speed improvement.
This commit is contained in:
Bastien Montagne 2022-06-09 14:58:35 +02:00
parent 6d726192be
commit 14d1ad8dd8
1 changed files with 4 additions and 5 deletions

View File

@ -256,12 +256,11 @@ FCurve *BKE_fcurve_find(ListBase *list, const char rna_path[], const int array_i
/* Check paths of curves, then array indices... */
for (fcu = list->first; fcu; fcu = fcu->next) {
/* Check indices first, much cheaper than a string comparison. */
/* Simple string-compare (this assumes that they have the same root...) */
if (fcu->rna_path && STREQ(fcu->rna_path, rna_path)) {
/* Now check indices. */
if (fcu->array_index == array_index) {
return fcu;
}
if (UNLIKELY(fcu->array_index == array_index && fcu->rna_path &&
fcu->rna_path[0] == rna_path[0] && STREQ(fcu->rna_path, rna_path))) {
return fcu;
}
}