From cc5aaf38b021fbb503218a8742e85b42aedca4b6 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 3 May 2020 03:42:34 -0700 Subject: [PATCH 1/2] Speed-up inner loop by skipping dummy entries --- Objects/setobject.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c index bbe013bcfac748a..e84af081bf998fa 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -137,7 +137,6 @@ static int set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) { setentry *table; - setentry *freeslot; setentry *entry; size_t perturb; size_t mask; @@ -158,7 +157,6 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) if (entry->key == NULL) goto found_unused; - freeslot = NULL; perturb = hash; while (1) { @@ -187,14 +185,12 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) goto restart; mask = so->mask; /* help avoid a register spill */ } - else if (entry->hash == -1) - freeslot = entry; if (i + LINEAR_PROBES <= mask) { for (j = 0 ; j < LINEAR_PROBES ; j++) { entry++; if (entry->hash == 0 && entry->key == NULL) - goto found_unused_or_dummy; + goto found_unused_; if (entry->hash == hash) { PyObject *startkey = entry->key; assert(startkey != dummy); @@ -216,8 +212,6 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) goto restart; mask = so->mask; } - else if (entry->hash == -1) - freeslot = entry; } } @@ -226,17 +220,9 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) entry = &so->table[i]; if (entry->key == NULL) - goto found_unused_or_dummy; + goto found_unused_; } - found_unused_or_dummy: - if (freeslot == NULL) - goto found_unused; - so->used++; - freeslot->key = key; - freeslot->hash = hash; - return 0; - found_unused: so->fill++; so->used++; From e41ade9f8e133efea13e5e00a2a92931c4e88003 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 3 May 2020 03:44:55 -0700 Subject: [PATCH 2/2] Fix typo --- Objects/setobject.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c index e84af081bf998fa..df4a0e1e9420e66 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -190,7 +190,7 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) for (j = 0 ; j < LINEAR_PROBES ; j++) { entry++; if (entry->hash == 0 && entry->key == NULL) - goto found_unused_; + goto found_unused; if (entry->hash == hash) { PyObject *startkey = entry->key; assert(startkey != dummy); @@ -220,7 +220,7 @@ set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash) entry = &so->table[i]; if (entry->key == NULL) - goto found_unused_; + goto found_unused; } found_unused: