Unverified Commit abf70309 authored by Viktor Söderqvist's avatar Viktor Söderqvist Committed by GitHub
Browse files

Shrink dict without rehashing (#11540)

When we're shrinking the hash table, we don't need to hash the keys. 
Since the table sizes are powers of two, we can simply mask the bucket 
index in the larger table to get the bucket index in the smaller table. We 
avoid loading the keys into memory and save CPU time.
parent ce4ebe6b
...@@ -229,7 +229,14 @@ int dictRehash(dict *d, int n) { ...@@ -229,7 +229,14 @@ int dictRehash(dict *d, int n) {
nextde = de->next; nextde = de->next;
/* Get the index in the new hash table */ /* Get the index in the new hash table */
h = dictHashKey(d, de->key) & DICTHT_SIZE_MASK(d->ht_size_exp[1]); if (d->ht_size_exp[1] > d->ht_size_exp[0]) {
h = dictHashKey(d, de->key) & DICTHT_SIZE_MASK(d->ht_size_exp[1]);
} else {
/* We're shrinking the table. The tables sizes are powers of
* two, so we simply mask the bucket index in the larger table
* to get the bucket index in the smaller table. */
h = d->rehashidx & DICTHT_SIZE_MASK(d->ht_size_exp[1]);
}
de->next = d->ht_table[1][h]; de->next = d->ht_table[1][h];
d->ht_table[1][h] = de; d->ht_table[1][h] = de;
d->ht_used[0]--; d->ht_used[0]--;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment