[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26193] trunk/blender/source/blender: use string/int/length lookup functions for bpy.types, gives 20-30% overall startup time speedup on my system.

Campbell Barton ideasman42 at gmail.com
Fri Jan 22 15:06:42 CET 2010


Revision: 26193
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26193
Author:   campbellbarton
Date:     2010-01-22 15:06:42 +0100 (Fri, 22 Jan 2010)

Log Message:
-----------
use string/int/length lookup functions for bpy.types, gives 20-30% overall startup time speedup on my system.

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/intern/rna_rna.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/makesrna/intern/rna_rna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_rna.c	2010-01-22 13:57:35 UTC (rev 26192)
+++ trunk/blender/source/blender/makesrna/intern/rna_rna.c	2010-01-22 14:06:42 UTC (rev 26193)
@@ -798,6 +798,42 @@
 	rna_iterator_listbase_begin(iter, &((BlenderRNA*)ptr->data)->structs, NULL);
 }
 
+/* optional, for faster lookups */
+static int rna_BlenderRNA_structs_length(PointerRNA *ptr, int index)
+{
+	return BLI_countlist(&((BlenderRNA*)ptr->data)->structs);
+}
+static PointerRNA rna_BlenderRNA_structs_lookup_int(PointerRNA *ptr, int index)
+{
+	StructRNA *srna= BLI_findlink(&((BlenderRNA*)ptr->data)->structs, index);
+
+	if(srna) {
+		PointerRNA r_ptr;
+		RNA_pointer_create(NULL, &RNA_Struct, srna, &r_ptr);
+		return r_ptr;
+	}
+	else {
+		return PointerRNA_NULL;
+	}
+}
+static PointerRNA rna_BlenderRNA_structs_lookup_string(PointerRNA *ptr, const char *key)
+{
+	StructRNA *srna= ((BlenderRNA*)ptr->data)->structs.first;
+	for(; srna; srna=srna->cont.next)
+		if(key[0] == srna->identifier[0] && strcmp(key, srna->identifier)==0)
+			break;
+
+	if(srna) {
+		PointerRNA r_ptr;
+		RNA_pointer_create(NULL, &RNA_Struct, srna, &r_ptr);
+		return r_ptr;
+	}
+	else {
+		return PointerRNA_NULL;
+	}
+}
+
+
 #else
 
 static void rna_def_struct(BlenderRNA *brna)
@@ -1238,7 +1274,14 @@
 	prop= RNA_def_property(srna, "structs", PROP_COLLECTION, PROP_NONE);
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
 	RNA_def_property_struct_type(prop, "Struct");
-	RNA_def_property_collection_funcs(prop, "rna_BlenderRNA_structs_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0);
+	RNA_def_property_collection_funcs(prop, "rna_BlenderRNA_structs_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get",
+		/* included for speed, can be removed */
+#if 0
+			0,0,0);
+#else
+			"rna_BlenderRNA_structs_length", "rna_BlenderRNA_structs_lookup_int", "rna_BlenderRNA_structs_lookup_string");
+#endif
+
 	RNA_def_property_ui_text(prop, "Structs", "");
 }
 

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2010-01-22 13:57:35 UTC (rev 26192)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2010-01-22 14:06:42 UTC (rev 26193)
@@ -3472,8 +3472,13 @@
 {
 	PointerRNA newptr;
 	PyObject *ret;
+	char *name= _PyUnicode_AsString(pyname);
 	
-	if (RNA_property_collection_lookup_string(&self->ptr, self->prop, _PyUnicode_AsString(pyname), &newptr)) {
+	if(strcmp(name, "register")==0) {
+		/* this is called so often, make an exception and save a full lookup on all types */
+		ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
+	}
+	else if (RNA_property_collection_lookup_string(&self->ptr, self->prop, name, &newptr)) {
 		ret= pyrna_struct_Subtype(&newptr);
 		if (ret==NULL) {
 			PyErr_Format(PyExc_SystemError, "bpy.types.%.200s subtype could not be generated, this is a bug!", _PyUnicode_AsString(pyname));





More information about the Bf-blender-cvs mailing list