Small optimization for hash library.
authorBen Pfaff <blp@gnu.org>
Mon, 26 Jun 2006 05:37:53 +0000 (05:37 +0000)
committerBen Pfaff <blp@gnu.org>
Mon, 26 Jun 2006 05:37:53 +0000 (05:37 +0000)
src/libpspp/ChangeLog
src/libpspp/hash.c

index ec8a40de17f225b27ec919b3678405481019b7fe..892dcd31aa5b89ff94180730541f8d89e76fee8a 100644 (file)
@@ -1,3 +1,13 @@
+Sun Jun 25 22:35:28 2006  Ben Pfaff  <blp@gnu.org>
+
+       Optimize rehashing: we know that none of the entries in the hash
+       table are equal, so we need not compare them to each other during
+       rehashing.
+       
+       * hash.c: (locate_empty_entry) New function.
+       (rehash) Use locate_empty_entry() instead of
+       locate_matching_entry().
+
 Fri Jun  9 14:03:29 2006  Ben Pfaff  <blp@gnu.org>
 
        Reform string library.
index 55b3a6f1516b76494824ce915e682fde1b508105..dcf8d8fffdc28945ed983614f28912d9179a9623 100644 (file)
@@ -251,6 +251,24 @@ locate_matching_entry (struct hsh_table *h, const void *target)
     }
 }
 
+/* Returns the index of an empty entry that indicates
+   where TARGET should go, assuming that TARGET is not equal to
+   any item already in the hash table. */
+static inline unsigned
+locate_empty_entry (struct hsh_table *h, const void *target) 
+{
+  unsigned i = h->hash (target, h->aux);
+
+  assert (h->hash_ordered);
+  for (;;)
+    {
+      i &= h->size - 1;
+      if (h->entries[i] == NULL)
+       return i;
+      i--;
+    }
+}
+
 /* Changes the capacity of H to NEW_SIZE, which must be a
    positive power of 2 at least as large as the number of
    elements in H. */
@@ -277,7 +295,7 @@ rehash (struct hsh_table *h, size_t new_size)
     {
       void *entry = *table_p;
       if (entry != NULL)
-        h->entries[locate_matching_entry (h, entry)] = entry;
+        h->entries[locate_empty_entry (h, entry)] = entry;
     }
   free (begin);