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>
This commit is contained in:
Jeff Hostetler 2017-03-22 17:14:20 +00:00 committed by Junio C Hamano
parent 3b9e3c2ced
commit 16f9b4cdd3

View File

@ -120,7 +120,8 @@ static void lazy_init_name_hash(struct index_state *istate)
return; return;
hashmap_init(&istate->name_hash, (hashmap_cmp_fn) cache_entry_cmp, hashmap_init(&istate->name_hash, (hashmap_cmp_fn) cache_entry_cmp,
istate->cache_nr); istate->cache_nr);
hashmap_init(&istate->dir_hash, (hashmap_cmp_fn) dir_entry_cmp, 0); hashmap_init(&istate->dir_hash, (hashmap_cmp_fn) dir_entry_cmp,
istate->cache_nr);
for (nr = 0; nr < istate->cache_nr; nr++) for (nr = 0; nr < istate->cache_nr; nr++)
hash_index_entry(istate, istate->cache[nr]); hash_index_entry(istate, istate->cache[nr]);
istate->name_hash_initialized = 1; istate->name_hash_initialized = 1;