[Python-checkins] bpo-40602: Optimize _Py_hashtable_get_ptr() (GH-20066)
Victor Stinner
webhook-mailer at python.org
Tue May 12 23:36:31 EDT 2020
https://github.com/python/cpython/commit/42bae3a3d9d79f28e6b3b619bd27296d125c4c2c
commit: 42bae3a3d9d79f28e6b3b619bd27296d125c4c2c
branch: master
author: Victor Stinner <vstinner at python.org>
committer: GitHub <noreply at github.com>
date: 2020-05-13T05:36:23+02:00
summary:
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().
files:
M Python/hashtable.c
diff --git a/Python/hashtable.c b/Python/hashtable.c
index dc4af3395181c..d1467ad94ed55 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,
More information about the Python-checkins
mailing list