[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59484] trunk/blender/source/blender: ghash: reserve size when its known or can be guessed close enough.

Campbell Barton ideasman42 at gmail.com
Sat Aug 24 19:33:47 CEST 2013


Revision: 59484
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59484
Author:   campbellbarton
Date:     2013-08-24 17:33:47 +0000 (Sat, 24 Aug 2013)
Log Message:
-----------
ghash: reserve size when its known or can be guessed close enough.
also avoid allocs per node in pbvh_bmesh_node_limit_ensure()

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/object_deform.c
    trunk/blender/source/blender/blenkernel/intern/pbvh.c
    trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c
    trunk/blender/source/blender/blenkernel/intern/treehash.c
    trunk/blender/source/blender/bmesh/intern/bmesh_log.c
    trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
    trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
    trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c
    trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
    trunk/blender/source/blender/editors/curve/editcurve.c
    trunk/blender/source/blender/editors/mesh/meshtools.c
    trunk/blender/source/blender/makesdna/intern/dna_genfile.c
    trunk/blender/source/blender/windowmanager/intern/wm.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/source/blender/blenkernel/intern/object_deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object_deform.c	2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/blenkernel/intern/object_deform.c	2013-08-24 17:33:47 UTC (rev 59484)
@@ -79,7 +79,7 @@
 		return NULL;
 	}
 
-	gh = BLI_ghash_str_new("BKE_objdef_validmap_get gh");
+	gh = BLI_ghash_str_new_ex("BKE_objdef_validmap_get gh", defbase_tot);
 
 	/* add all names to a hash table */
 	for (dg = ob->defbase.first; dg; dg = dg->next) {

Modified: trunk/blender/source/blender/blenkernel/intern/pbvh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pbvh.c	2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/blenkernel/intern/pbvh.c	2013-08-24 17:33:47 UTC (rev 59484)
@@ -277,11 +277,12 @@
 	GHash *map;
 	int i, j, totface;
 
-	map = BLI_ghash_int_new("build_mesh_leaf_node gh");
-	
 	node->uniq_verts = node->face_verts = 0;
 	totface = node->totprim;
 
+	/* reserve size is rough guess */
+	map = BLI_ghash_int_new_ex("build_mesh_leaf_node gh", 2 * totface);
+
 	node->face_vert_indices = MEM_callocN(sizeof(int) * 4 * totface,
 	                                      "bvh node face vert indices");
 

Modified: trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c	2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c	2013-08-24 17:33:47 UTC (rev 59484)
@@ -140,8 +140,8 @@
 	c2 = &bvh->nodes[children + 1];
 	c1->flag |= PBVH_Leaf;
 	c2->flag |= PBVH_Leaf;
-	c1->bm_faces = BLI_ghash_ptr_new("bm_faces");
-	c2->bm_faces = BLI_ghash_ptr_new("bm_faces");
+	c1->bm_faces = BLI_ghash_ptr_new_ex("bm_faces", BLI_ghash_size(n->bm_faces) / 2);
+	c2->bm_faces = BLI_ghash_ptr_new_ex("bm_faces", BLI_ghash_size(n->bm_faces) / 2);
 
 	/* Partition the parent node's faces between the two children */
 	GHASH_ITER (gh_iter, n->bm_faces) {
@@ -227,19 +227,26 @@
 static int pbvh_bmesh_node_limit_ensure(PBVH *bvh, int node_index)
 {
 	GHash *prim_bbc;
+	GHash *bm_faces;
+	int bm_faces_size;
 	GHashIterator gh_iter;
+	BBC *bbc_array;
+	unsigned int i;
 
-	if (BLI_ghash_size(bvh->nodes[node_index].bm_faces) <= bvh->leaf_limit) {
+	bm_faces = bvh->nodes[node_index].bm_faces;
+	bm_faces_size = BLI_ghash_size(bm_faces);
+	if (bm_faces_size <= bvh->leaf_limit) {
 		/* Node limit not exceeded */
 		return FALSE;
 	}
 
 	/* For each BMFace, store the AABB and AABB centroid */
-	prim_bbc = BLI_ghash_ptr_new("prim_bbc");
+	prim_bbc = BLI_ghash_ptr_new_ex("prim_bbc", bm_faces_size);
+	bbc_array = MEM_callocN(sizeof(BBC) * bm_faces_size, "BBC");
 
-	GHASH_ITER (gh_iter, bvh->nodes[node_index].bm_faces) {
+	GHASH_ITER_INDEX (gh_iter, bm_faces, i) {
 		BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
-		BBC *bbc = MEM_callocN(sizeof(BBC), "BBC");
+		BBC *bbc = &bbc_array[i];
 		BMLoop *l_iter;
 		BMLoop *l_first;
 
@@ -255,7 +262,8 @@
 
 	pbvh_bmesh_node_split(bvh, prim_bbc, node_index);
 
-	BLI_ghash_free(prim_bbc, NULL, MEM_freeN);
+	BLI_ghash_free(prim_bbc, NULL, NULL);
+	MEM_freeN(bbc_array);
 
 	return TRUE;
 }
@@ -1071,7 +1079,7 @@
 	n = bvh->nodes = MEM_callocN(sizeof(PBVHNode), "PBVHNode");
 	bvh->totnode = 1;
 	n->flag = PBVH_Leaf;
-	n->bm_faces = BLI_ghash_ptr_new("bm_faces");
+	n->bm_faces = BLI_ghash_ptr_new_ex("bm_faces", bvh->bm->totface);
 	BM_ITER_MESH (f, &iter, bvh->bm, BM_FACES_OF_MESH) {
 		BLI_ghash_insert(n->bm_faces, f, NULL);
 	}

Modified: trunk/blender/source/blender/blenkernel/intern/treehash.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/treehash.c	2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/blenkernel/intern/treehash.c	2013-08-24 17:33:47 UTC (rev 59484)
@@ -102,7 +102,7 @@
 
 void *BKE_treehash_create_from_treestore(BLI_mempool *treestore)
 {
-	GHash *treehash = BLI_ghash_new(tse_hash, tse_cmp, "treehash");
+	GHash *treehash = BLI_ghash_new_ex(tse_hash, tse_cmp, "treehash", BLI_mempool_count(treestore));
 	fill_treehash(treehash, treestore);
 	return treehash;
 }

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_log.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_log.c	2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_log.c	2013-08-24 17:33:47 UTC (rev 59484)
@@ -407,7 +407,7 @@
  */
 static GHash *bm_log_compress_ids_to_indices(unsigned int *ids, int totid)
 {
-	GHash *map = BLI_ghash_int_new(AT);
+	GHash *map = BLI_ghash_int_new_ex(AT, totid);
 	int i;
 
 	qsort(ids, totid, sizeof(*ids), uint_compare);
@@ -441,8 +441,8 @@
 	BMLog *log = MEM_callocN(sizeof(*log), AT);
 
 	log->unused_ids = range_tree_uint_alloc(0, (unsigned)-1);
-	log->id_to_elem = BLI_ghash_ptr_new(AT);
-	log->elem_to_id = BLI_ghash_ptr_new(AT);
+	log->id_to_elem = BLI_ghash_ptr_new_ex(AT, bm->totvert + bm->totface);
+	log->elem_to_id = BLI_ghash_ptr_new_ex(AT, bm->totvert + bm->totface);
 
 	/* Assign IDs to all existing vertices and faces */
 	bm_log_assign_ids(bm, log);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c	2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c	2013-08-24 17:33:47 UTC (rev 59484)
@@ -674,7 +674,7 @@
 		int *new_idx = NULL;
 
 		/* Init the old-to-new vert pointers mapping */
-		vptr_map = BLI_ghash_ptr_new("BM_mesh_remap vert pointers mapping");
+		vptr_map = BLI_ghash_ptr_new_ex("BM_mesh_remap vert pointers mapping", bm->totvert);
 
 		/* Make a copy of all vertices. */
 		verts_pool = MEM_callocN(sizeof(BMVert *) * totvert, "BM_mesh_remap verts pool");
@@ -708,7 +708,7 @@
 		int *new_idx = NULL;
 
 		/* Init the old-to-new vert pointers mapping */
-		eptr_map = BLI_ghash_ptr_new("BM_mesh_remap edge pointers mapping");
+		eptr_map = BLI_ghash_ptr_new_ex("BM_mesh_remap edge pointers mapping", bm->totedge);
 
 		/* Make a copy of all vertices. */
 		edges_pool = MEM_callocN(sizeof(BMEdge *) * totedge, "BM_mesh_remap edges pool");
@@ -741,7 +741,7 @@
 		int *new_idx = NULL;
 
 		/* Init the old-to-new vert pointers mapping */
-		fptr_map = BLI_ghash_ptr_new("BM_mesh_remap face pointers mapping");
+		fptr_map = BLI_ghash_ptr_new_ex("BM_mesh_remap face pointers mapping", bm->totface);
 
 		/* Make a copy of all vertices. */
 		faces_pool = MEM_callocN(sizeof(BMFace *) * totface, "BM_mesh_remap faces pool");

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.c	2013-08-24 17:33:47 UTC (rev 59484)
@@ -341,7 +341,7 @@
 		}
 
 		if (!slot_dst->data.ghash) {
-			slot_dst->data.ghash = BLI_ghash_ptr_new("bmesh operator 2");
+			slot_dst->data.ghash = BLI_ghash_ptr_new_ex("bmesh operator 2", BLI_ghash_size(slot_src->data.ghash));
 		}
 
 		for (BLI_ghashIterator_init(&it, slot_src->data.ghash);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c	2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c	2013-08-24 17:33:47 UTC (rev 59484)
@@ -87,8 +87,8 @@
 	walker->mask_edge = mask_edge;
 	walker->mask_face = mask_face;
 
-	walker->visithash = BLI_ghash_ptr_new("bmesh walkers 1");
-	walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec 1");
+	walker->visithash = BLI_ghash_ptr_new("bmesh walkers");
+	walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec");
 
 	if (UNLIKELY(type >= BMW_MAXWALKERS || type < 0)) {
 		fprintf(stderr,
@@ -253,8 +253,6 @@
 		BMW_state_remove(walker);
 	}
 	walker->depth = 0;
-	BLI_ghash_free(walker->visithash, NULL, NULL);
-	BLI_ghash_free(walker->secvisithash, NULL, NULL);
-	walker->visithash = BLI_ghash_ptr_new("bmesh walkers 1");
-	walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec 1");
+	BLI_ghash_clear(walker->visithash, NULL, NULL);
+	BLI_ghash_clear(walker->secvisithash, NULL, NULL);
 }

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c	2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c	2013-08-24 17:33:47 UTC (rev 59484)
@@ -494,8 +494,7 @@
 
 	lwalk->lastv = lwalk->startv = BM_edge_other_vert(owalk.cur, lwalk->lastv);
 
-	BLI_ghash_free(walker->visithash, NULL, NULL);
-	walker->visithash = BLI_ghash_ptr_new("bmesh walkers 2");
+	BLI_ghash_clear(walker->visithash, NULL, NULL);
 	BLI_ghash_insert(walker->visithash, owalk.cur, NULL);
 }
 
@@ -751,12 +750,10 @@
 	*lwalk = owalk;
 	lwalk->no_calc = false;
 
-	BLI_ghash_free(walker->secvisithash, NULL, NULL);
-	walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers 3");
+	BLI_ghash_clear(walker->secvisithash, NULL, NULL);
 	BLI_ghash_insert(walker->secvisithash, lwalk->l->e, NULL);
 
-	BLI_ghash_free(walker->visithash, NULL, NULL);
-	walker->visithash = BLI_ghash_ptr_new("bmesh walkers 3");
+	BLI_ghash_clear(walker->visithash, NULL, NULL);
 	BLI_ghash_insert(walker->visithash, lwalk->l->f, NULL);
 }
 
@@ -806,8 +803,9 @@
 			lwalk->no_calc = false;
 		}
 
-		BLI_ghash_insert(walker->secvisithash, l->e, NULL);
-		BLI_ghash_insert(walker->visithash, l->f, NULL);
+		/* both may already exist */
+		BLI_ghash_reinsert(walker->secvisithash, l->e, NULL, NULL, NULL);
+		BLI_ghash_reinsert(walker->visithash, l->f, NULL, NULL, NULL);
 	}
 
 	return f;
@@ -858,8 +856,7 @@
 		lwalk->l = lwalk->l->radial_next;
 	}
 
-	BLI_ghash_free(walker->visithash, NULL, NULL);
-	walker->visithash = BLI_ghash_ptr_new("bmesh walkers 4");
+	BLI_ghash_clear(walker->visithash, NULL, NULL);
 	BLI_ghash_insert(walker->visithash, lwalk->l->e, NULL);
 }
 


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list