]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
lib: Avoid the hash-lookup division if possible
authorJosh Stone <jistone@redhat.com>
Fri, 13 Dec 2013 00:34:15 +0000 (16:34 -0800)
committerJosh Stone <jistone@redhat.com>
Fri, 13 Dec 2013 17:48:07 +0000 (09:48 -0800)
For Dwarf_Abbrev codes, the most common case is that they're packed at
the low end, saving uleb128 encoding size.  Since the hash table is
always resized to be no more than 90% full, those codes are always less
than the table size, and dividing for the remainder is unnecessary.

Dwarf_Dies are frequently created anew, and need to find abbrev each
time, so even that one division becomes a noticeable hotspot.  This
patch adds a branch to avoid it, which is very predictable for the CPU.

Signed-off-by: Josh Stone <jistone@redhat.com>
lib/ChangeLog
lib/dynamicsizehash.c

index 6ce3168f0ae6628206f873d31599a96afee7972e..9b8899e2ca5c3511bd590b872adef1769efe7fbf 100644 (file)
@@ -1,3 +1,7 @@
+2013-12-12  Josh Stone  <jistone@redhat.com>
+
+       * dynamicsizehash.c (lookup): Add a shortcut around division.
+
 2013-04-30  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * eu-config.h (COMPAT_VERSION_NEWPROTO): New.  Twice.
index 40f48d5ed119e5b10804d38ac54a7c60a8bc44cd..1fdff1b06dc3d6a8caa26443cb026a89cab60c5f 100644 (file)
@@ -49,8 +49,9 @@ lookup (htab, hval, val)
      HASHTYPE hval;
      TYPE val __attribute__ ((unused));
 {
-  /* First hash function: simply take the modul but prevent zero.  */
-  size_t idx = 1 + hval % htab->size;
+  /* First hash function: simply take the modul but prevent zero.  Small values
+     can skip the division, which helps performance when this is common.  */
+  size_t idx = 1 + (hval < htab->size ? hval : hval % htab->size);
 
   if (htab->table[idx].hashval != 0)
     {