diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2019-12-19 23:58:59 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2019-12-20 16:29:35 +0300 |
commit | 46607bc09d5cd9fa3570e5ad4b01ea4ea7adaffc (patch) | |
tree | 7a1b14466e1de6744031c7dfc3ca25711d363ea3 /source/blender/blenloader/intern | |
parent | 4cc8201a651007b7308a4468a550dbbd97c6c346 (diff) |
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.
Diffstat (limited to 'source/blender/blenloader/intern')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 5b73a7521e2..8085beb6351 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -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 |