Prehash basenames to avoid recalculation when adding new ones
authorPanu Matilainen <pmatilai@redhat.com>
Wed, 5 Sep 2012 07:41:44 +0000 (10:41 +0300)
committerPanu Matilainen <pmatilai@redhat.com>
Wed, 5 Sep 2012 07:41:44 +0000 (10:41 +0300)
- Speedup depends on the transaction and is by no means enormous,
  but on my testcase of a largish erasure transaction this shaves
  off circa four percent of the cycles spent in (re)hashing the
  basenames.

lib/transaction.c

index 8d2527d..011e345 100644 (file)
@@ -909,15 +909,18 @@ rpmdbMatchIterator rpmFindBaseNamesInDB(rpmts ts, uint64_t fileCount)
        fi = rpmfiInit(rpmteFI(p), 0);
        while (rpmfiNext(fi) >= 0) {
            size_t keylen;
+           unsigned int keyhash;
            baseName = rpmfiBN(fi);
-           if (rpmStringSetHasEntry(baseNames, baseName))
+
+           keyhash = rpmStringSetKeyHash(baseNames, baseName);
+           if (rpmStringSetHasHEntry(baseNames, baseName, keyhash))
                continue;
 
            keylen = strlen(baseName);
            if (keylen == 0)
                keylen++;       /* XXX "/" fixup. */
            rpmdbExtendIterator(mi, baseName, keylen);
-           rpmStringSetAddEntry(baseNames, baseName);
+           rpmStringSetAddHEntry(baseNames, baseName, keyhash);
         }
     }
     rpmtsiFree(pi);