use ghash for DNA_struct_find_nr(), gives ~18% speedup on loading sintel lite, will also speedup undo.

note: only works with CMake, wasn't able to get this working with scons, complains about same file being built in different environments.
This commit is contained in:
Campbell Barton 2011-08-20 14:23:43 +00:00
parent a0a96a84fe
commit d4dec1c3bc
5 changed files with 65 additions and 10 deletions

@ -54,7 +54,10 @@ typedef struct SDNA {
(sp[2], sp[3]), (sp[4], sp[5]), .. are the member
type and name numbers respectively */
struct GHash *structs_map; /* ghash for faster lookups,
requires WITH_DNA_GHASH to be used for now */
/* wrong place for this really, its a simple
* cache for findstruct_nr.
*/

@ -27,12 +27,17 @@
# message(STATUS "Configuring makesdna")
# add_definitions(-DWITH_DNA_GHASH)
blender_include_dirs(
../../../../intern/guardedalloc
../../blenloader
../../blenlib
..
)
# -----------------------------------------------------------------------------
# Build makesdna executable
set(SRC
makesdna.c
@ -56,6 +61,8 @@ add_custom_command(
DEPENDS makesdna
)
# -----------------------------------------------------------------------------
# Build bf_dna library
set(INC
@ -72,3 +79,22 @@ set(SRC
)
blender_add_lib(bf_dna "${SRC}" "${INC}" "${INC_SYS}")
# -----------------------------------------------------------------------------
# Build bf_dna_blenlib library
set(INC
)
set(INC_SYS
)
set(SRC
../../blenlib/intern/BLI_mempool.c
../../blenlib/intern/listbase.c
../../blenlib/intern/BLI_ghash.c
)
blender_add_lib(bf_dna_blenlib "${SRC}" "${INC}" "${INC_SYS}")

@ -67,5 +67,6 @@ else:
else:
dna.Command ('dna.c', '', root_build_dir+os.sep+"makesdna.exe $TARGET")
# TODO, get WITH_DNA_GHASH working, see CMake's 'WITH_DNA_GHASH'
obj = ['intern/dna.c', 'intern/dna_genfile.c']
Return ('obj')

@ -42,6 +42,10 @@
#include "MEM_guardedalloc.h" // for MEM_freeN MEM_mallocN MEM_callocN
#ifdef WITH_DNA_GHASH
# include "BLI_ghash.h"
#endif
#include "DNA_genfile.h"
#include "DNA_sdna_types.h" // for SDNA ;-)
@ -197,7 +201,11 @@ void DNA_sdna_free(SDNA *sdna)
MEM_freeN((void *)sdna->names);
MEM_freeN(sdna->types);
MEM_freeN(sdna->structs);
#ifdef WITH_DNA_GHASH
BLI_ghash_free(sdna->structs_map, NULL, NULL);
#endif
MEM_freeN(sdna);
}
@ -275,24 +283,30 @@ static short *findstruct_name(SDNA *sdna, const char *str)
int DNA_struct_find_nr(SDNA *sdna, const char *str)
{
short *sp= NULL;
int a;
if(sdna->lastfind<sdna->nr_structs) {
sp= sdna->structs[sdna->lastfind];
if(strcmp( sdna->types[ sp[0] ], str )==0) return sdna->lastfind;
}
for(a=0; a<sdna->nr_structs; a++) {
#ifdef WITH_DNA_GHASH
return (intptr_t)BLI_ghash_lookup(sdna->structs_map, str) - 1;
#else
{
int a;
sp= sdna->structs[a];
if(strcmp( sdna->types[ sp[0] ], str )==0) {
sdna->lastfind= a;
return a;
for(a=0; a<sdna->nr_structs; a++) {
sp= sdna->structs[a];
if(strcmp( sdna->types[ sp[0] ], str )==0) {
sdna->lastfind= a;
return a;
}
}
}
return -1;
#endif
}
/* ************************* END DIV ********************** */
@ -481,6 +495,16 @@ static void init_structDNA(SDNA *sdna, int do_endian_swap)
sp[10]= 9;
}
}
#ifdef WITH_DNA_GHASH
/* create a ghash lookup to speed up */
sdna->structs_map= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp, "init_structDNA gh");
for(nr = 0; nr < sdna->nr_structs; nr++) {
sp= sdna->structs[nr];
BLI_ghash_insert(sdna->structs_map, (void *)sdna->types[sp[0]], (void *)(nr + 1));
}
#endif
}
}

@ -243,6 +243,7 @@ blender_include_dirs_sys(
add_executable(makesrna ${SRC} ${SRC_RNA_INC} ${SRC_DNA_INC})
target_link_libraries(makesrna bf_dna)
target_link_libraries(makesrna bf_dna_blenlib)
# Output rna_*_gen.c
# note (linux only): with crashes try add this after COMMAND: valgrind --leak-check=full --track-origins=yes