name-hash: specify initial size for istate.dir_hash table

Specify an initial size for the istate.dir_hash HashMap matching the size of the istate.name_hash. Previously hashmap_init() was given 0, causing a 64 bucket hashmap to be created. When working with very large repositories, this would cause numerous rehash() calls to realloc and rebalance the hashmap. This is especially true when the worktree is deep, with many directories containing a few files. Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff Hostetler committed Mar 22, 2017 at 17:14 UTC 16f9b4cdd31de2b8185c5c717efa6d28c56b3c74
1 file changed +2 -1
name-hash.c
+2 -1
@@ -120,7 +120,8 @@ static void lazy_init_name_hash(struct index_state *istate)
120 return;
121 hashmap_init(&istate->name_hash, (hashmap_cmp_fn) cache_entry_cmp,
122 istate->cache_nr);
123 - hashmap_init(&istate->dir_hash, (hashmap_cmp_fn) dir_entry_cmp, 0);
123 + hashmap_init(&istate->dir_hash, (hashmap_cmp_fn) dir_entry_cmp,
124 + istate->cache_nr);
125 for (nr = 0; nr < istate->cache_nr; nr++)
126 hash_index_entry(istate, istate->cache[nr]);
127 istate->name_hash_initialized = 1;