diff options
author | Victor Stinner <vstinner@python.org> | 2020-05-13 03:36:23 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-13 03:36:23 (GMT) |
commit | 42bae3a3d9d79f28e6b3b619bd27296d125c4c2c (patch) | |
tree | 7eddc3adb81ca5d6caaebcee7718108c564445f5 /Python/hashtable.c | |
parent | 5b0a30354d8a8bb39a05ce10ca4f5c78b729f25b (diff) | |
download | cpython-42bae3a3d9d79f28e6b3b619bd27296d125c4c2c.zip cpython-42bae3a3d9d79f28e6b3b619bd27296d125c4c2c.tar.gz cpython-42bae3a3d9d79f28e6b3b619bd27296d125c4c2c.tar.bz2 |
bpo-40602: Optimize _Py_hashtable_get_ptr() (GH-20066)
_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().
Diffstat (limited to 'Python/hashtable.c')
-rw-r--r-- | Python/hashtable.c | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/Python/hashtable.c b/Python/hashtable.c index dc4af33..d1467ad 100644 --- a/Python/hashtable.c +++ b/Python/hashtable.c @@ -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) { @@ -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, |