[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