use ghash for DNA_struct_find_nr(), gives ~18% speedup on loading sintel lite, will...
authorCampbell Barton <ideasman42@gmail.com>
Sat, 20 Aug 2011 14:23:43 +0000 (14:23 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 20 Aug 2011 14:23:43 +0000 (14:23 +0000)
note: only works with CMake, wasn't able to get this working with scons, complains about same file being built in different environments.

source/blender/makesdna/DNA_sdna_types.h
source/blender/makesdna/intern/CMakeLists.txt
source/blender/makesdna/intern/SConscript
source/blender/makesdna/intern/dna_genfile.c
source/blender/makesrna/intern/CMakeLists.txt

index e5f924b5fa6ba7aeb0c252caabecba113ef72da6..829d1eee03b09ce2b86d31e8011015d81f8d76b2 100644 (file)
@@ -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.
                 */
index 429db63b5266f459ff0a078ae2c28e7ba098e3f7..5edebfe3903bdc091b82328bb515e14ccbadca3e 100644 (file)
 
 # 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}")
index e51ee53e07894e7d10fcbe740861f9ae8f7c3960..8185676cbfc69c807d1cb172797c35adf795dd72 100644 (file)
@@ -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')
index 4e9b023b3260c224a4e5cc18acdfda0cbc81e084..ebcfce84e3733bd5d02def50693493029925591f 100644 (file)
 
 #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
        }
 }
 
index cb593e7deab26a2a6eae730df85fc6451de0e166..cc7bcf04716e70e430939e53f694763afdb17228 100644 (file)
@@ -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