Revision: 39568
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39568
Author:   campbellbarton
Date:     2011-08-20 14:23:43 +0000 (Sat, 20 Aug 2011)
Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_sdna_types.h
    trunk/blender/source/blender/makesdna/intern/CMakeLists.txt
    trunk/blender/source/blender/makesdna/intern/SConscript
    trunk/blender/source/blender/makesdna/intern/dna_genfile.c
    trunk/blender/source/blender/makesrna/intern/CMakeLists.txt

Modified: trunk/blender/source/blender/makesdna/DNA_sdna_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_sdna_types.h      2011-08-20 
13:29:42 UTC (rev 39567)
+++ trunk/blender/source/blender/makesdna/DNA_sdna_types.h      2011-08-20 
14:23:43 UTC (rev 39568)
@@ -54,7 +54,10 @@
 
                                                   (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.
                 */

Modified: trunk/blender/source/blender/makesdna/intern/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/makesdna/intern/CMakeLists.txt 2011-08-20 
13:29:42 UTC (rev 39567)
+++ trunk/blender/source/blender/makesdna/intern/CMakeLists.txt 2011-08-20 
14:23:43 UTC (rev 39568)
@@ -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 @@
        DEPENDS makesdna
 )
 
+
+# -----------------------------------------------------------------------------
 # Build bf_dna library
 set(INC
 
@@ -72,3 +79,22 @@
 )
 
 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}")

Modified: trunk/blender/source/blender/makesdna/intern/SConscript
===================================================================
--- trunk/blender/source/blender/makesdna/intern/SConscript     2011-08-20 
13:29:42 UTC (rev 39567)
+++ trunk/blender/source/blender/makesdna/intern/SConscript     2011-08-20 
14:23:43 UTC (rev 39568)
@@ -67,5 +67,6 @@
     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')

Modified: trunk/blender/source/blender/makesdna/intern/dna_genfile.c
===================================================================
--- trunk/blender/source/blender/makesdna/intern/dna_genfile.c  2011-08-20 
13:29:42 UTC (rev 39567)
+++ trunk/blender/source/blender/makesdna/intern/dna_genfile.c  2011-08-20 
14:23:43 UTC (rev 39568)
@@ -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 @@
        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 @@
 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 @@
                                        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
        }
 }
 

Modified: trunk/blender/source/blender/makesrna/intern/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/makesrna/intern/CMakeLists.txt 2011-08-20 
13:29:42 UTC (rev 39567)
+++ trunk/blender/source/blender/makesrna/intern/CMakeLists.txt 2011-08-20 
14:23:43 UTC (rev 39568)
@@ -243,6 +243,7 @@
 
 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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to