ID Management: Improve speed of code used when creating/renaming and ID.
This commit affects `id_sort_by_name()` and `check_for_dupid()` helper: * Add a new parameter, `ID *id_sorting_hint`, to `id_sort_by_name()`, and when non-NULL, check if we can insert `id` immediately before or after it. This can dramatically reduce time spent in that function. * Use loop over whole list in `check_for_dupid()` to also define the likely ID pointer that will be neighbor with our new one. This gives another decent speedup to all massive addition cases: | Number and type of names of IDs | old code | new code | speed improvement | | -------------------------------- | -------- | -------- | ----------------- | | 40K, mixed (14k rand, 26k const) | 39s | 33s | 18% | | 40K, fully random | 51s | 42s | 21% | | 40K, fully constant | 40s | 34s | 18% | Combined with the previous commits, this makes massive addition of IDs more than twice as fast as previously.
This commit is contained in:
@@ -9189,7 +9189,7 @@ static ID *create_placeholder(Main *mainvar, const short idcode, const char *idn
|
||||
ph_id->icon_id = 0;
|
||||
|
||||
BLI_addtail(lb, ph_id);
|
||||
id_sort_by_name(lb, ph_id);
|
||||
id_sort_by_name(lb, ph_id, NULL);
|
||||
|
||||
return ph_id;
|
||||
}
|
||||
@@ -11590,7 +11590,7 @@ static ID *link_named_part(
|
||||
if (id) {
|
||||
/* sort by name in list */
|
||||
ListBase *lb = which_libbase(mainl, idcode);
|
||||
id_sort_by_name(lb, id);
|
||||
id_sort_by_name(lb, id, NULL);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -11647,7 +11647,7 @@ int BLO_library_link_copypaste(Main *mainl, BlendHandle *bh, const unsigned int
|
||||
if (id) {
|
||||
/* sort by name in list */
|
||||
ListBase *lb = which_libbase(mainl, GS(id->name));
|
||||
id_sort_by_name(lb, id);
|
||||
id_sort_by_name(lb, id, NULL);
|
||||
|
||||
if (bhead->code == ID_OB) {
|
||||
/* Instead of instancing Base's directly, postpone until after collections are loaded
|
||||
|
||||
Reference in New Issue
Block a user