Skip to content

Commit

Permalink
bpo-40602: Optimize _Py_hashtable_get_ptr() (GH-20066)
Browse files Browse the repository at this point in the history
_Py_hashtable_get_entry_ptr() avoids comparing the entry hash:
compare directly keys.

Move _Py_hashtable_get_entry_ptr() just after
_Py_hashtable_get_entry_generic().
  • Loading branch information
vstinner committed May 13, 2020
1 parent 5b0a303 commit 42bae3a
Showing 1 changed file with 23 additions and 24 deletions.
47 changes: 23 additions & 24 deletions Python/hashtable.c
Expand Up @@ -193,6 +193,29 @@ _Py_hashtable_get_entry_generic(_Py_hashtable_t *ht, const void *key)
}


// Specialized for:
// hash_func == _Py_hashtable_hash_ptr
// compare_func == _Py_hashtable_compare_direct
static _Py_hashtable_entry_t *
_Py_hashtable_get_entry_ptr(_Py_hashtable_t *ht, const void *key)
{
Py_uhash_t key_hash = _Py_hashtable_hash_ptr(key);
size_t index = key_hash & (ht->num_buckets - 1);
_Py_hashtable_entry_t *entry = entry = TABLE_HEAD(ht, index);
while (1) {
if (entry == NULL) {
return NULL;
}
// Compare directly keys (ignore entry->key_hash)
if (entry->key == key) {
break;
}
entry = ENTRY_NEXT(entry);
}
return entry;
}


void*
_Py_hashtable_steal(_Py_hashtable_t *ht, const void *key)
{
Expand Down Expand Up @@ -275,30 +298,6 @@ _Py_hashtable_get(_Py_hashtable_t *ht, const void *key)
}


// Specialized for:
// hash_func == _Py_hashtable_hash_ptr
// compare_func == _Py_hashtable_compare_direct
_Py_hashtable_entry_t *
_Py_hashtable_get_entry_ptr(_Py_hashtable_t *ht, const void *key)
{
Py_uhash_t key_hash = _Py_hashtable_hash_ptr(key);
size_t index = key_hash & (ht->num_buckets - 1);
_Py_hashtable_entry_t *entry = entry = TABLE_HEAD(ht, index);
while (1) {
if (entry == NULL) {
return NULL;
}
if (entry->key_hash == key_hash) {
if (entry->key == key) {
break;
}
}
entry = ENTRY_NEXT(entry);
}
return entry;
}


int
_Py_hashtable_foreach(_Py_hashtable_t *ht,
_Py_hashtable_foreach_func func,
Expand Down

0 comments on commit 42bae3a

Please sign in to comment.