[Python-checkins] cpython: Hoist constant expressions (so->table and so->mask) out of the inner-loop.

raymond.hettinger python-checkins at python.org
Sun Dec 13 21:45:06 EST 2015


https://hg.python.org/cpython/rev/c8de4f05c6c3
changeset:   99561:c8de4f05c6c3
user:        Raymond Hettinger <python at rcn.com>
date:        Sun Dec 13 18:45:01 2015 -0800
summary:
  Hoist constant expressions (so->table and so->mask) out of the inner-loop.

files:
  Objects/setobject.c |  24 ++++++++++++------------
  1 files changed, 12 insertions(+), 12 deletions(-)


diff --git a/Objects/setobject.c b/Objects/setobject.c
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -260,16 +260,13 @@
 the setobject's fill and used fields.
 */
 static void
-set_insert_clean(PySetObject *so, PyObject *key, Py_hash_t hash)
+set_insert_clean(setentry *table, size_t mask, PyObject *key, Py_hash_t hash)
 {
-    setentry *table = so->table;
     setentry *entry;
     size_t perturb = hash;
-    size_t mask = (size_t)so->mask;
     size_t i = (size_t)hash & mask;
     size_t j;
 
-    assert(so->fill == so->used);
     while (1) {
         entry = &table[i];
         if (entry->key == NULL)
@@ -285,8 +282,8 @@
         i = (i * 5 + 1 + perturb) & mask;
     }
   found_null:
+    entry->hash = hash;
     entry->key = key;
-    entry->hash = hash;
 }
 
 /* ======== End logic for probing the hash table ========================== */
@@ -304,6 +301,8 @@
     setentry *oldtable, *newtable, *entry;
     Py_ssize_t oldfill = so->fill;
     Py_ssize_t oldused = so->used;
+    Py_ssize_t oldmask = so->mask;
+    size_t newmask;
     int is_oldtable_malloced;
     setentry small_copy[PySet_MINSIZE];
 
@@ -363,18 +362,17 @@
 
     /* Copy the data over; this is refcount-neutral for active entries;
        dummy entries aren't copied over, of course */
+    newmask = (size_t)so->mask;
     if (oldfill == oldused) {
-        for (entry = oldtable; oldused > 0; entry++) {
+        for (entry = oldtable; entry <= oldtable + oldmask; entry++) {
             if (entry->key != NULL) {
-                oldused--;
-                set_insert_clean(so, entry->key, entry->hash);
+                set_insert_clean(newtable, newmask, entry->key, entry->hash);
             }
         }
     } else {
-        for (entry = oldtable; oldused > 0; entry++) {
+        for (entry = oldtable; entry <= oldtable + oldmask; entry++) {
             if (entry->key != NULL && entry->key != dummy) {
-                oldused--;
-                set_insert_clean(so, entry->key, entry->hash);
+                set_insert_clean(newtable, newmask, entry->key, entry->hash);
             }
         }
     }
@@ -676,13 +674,15 @@
 
     /* If our table is empty, we can use set_insert_clean() */
     if (so->fill == 0) {
+        setentry *newtable = so->table;
+        size_t newmask = (size_t)so->mask;
         so->fill = other->used;
         so->used = other->used;
         for (i = 0; i <= other->mask; i++, other_entry++) {
             key = other_entry->key;
             if (key != NULL && key != dummy) {
                 Py_INCREF(key);
-                set_insert_clean(so, key, other_entry->hash);
+                set_insert_clean(newtable, newmask, key, other_entry->hash);
             }
         }
         return 0;

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list