[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39568] trunk/blender/source/blender: use ghash for DNA_struct_find_nr(), gives ~18% speedup on loading sintel lite, will also speedup undo.

Campbell Barton ideasman42 at gmail.com
Sat Aug 20 16:23:44 CEST 2011


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




More information about the Bf-blender-cvs mailing list