]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Prefetch First Batch of Match Positions; +11% Speed in Level 5 w/ 1 Dict
authorW. Felix Handte <w@felixhandte.com>
Tue, 18 Aug 2020 17:30:41 +0000 (13:30 -0400)
committerW. Felix Handte <w@felixhandte.com>
Thu, 10 Sep 2020 22:51:52 +0000 (18:51 -0400)
lib/compress/zstd_lazy.c

index 5e38e49cc6937ff59577b26ad70dc635ee755af0..30330a12c86984a3399f2cc7e70b8e571060e2a8 100644 (file)
@@ -574,8 +574,7 @@ size_t ZSTD_HcFindBestMatch_generic (
         const U32 ddsIndexDelta        = dictLimit - ddsSize;
         const U32 ddsMinChain = ddsSize > ddsChainSize ? ddsSize - ddsChainSize : 0;
         const U32 bucketSize           = (1 << DD_BLOG);
-
-        U32 attemptNb = 1;
+        U32 attemptNb;
 
         matchIndex = dms->hashTable[ddsIdx];
 
@@ -583,7 +582,11 @@ size_t ZSTD_HcFindBestMatch_generic (
         if (!matchIndex)
             return ml;
 
-        for ( ; (matchIndex>ddsLowestIndex) & (nbAttempts>0) ; nbAttempts--, attemptNb++) {
+        for (attemptNb = 0; attemptNb < bucketSize; attemptNb++) {
+            PREFETCH_L1(ddsBase + dms->hashTable[ddsIdx + attemptNb]);
+        }
+
+        for (attemptNb = 1; (matchIndex>ddsLowestIndex) & (nbAttempts>0) ; nbAttempts--, attemptNb++) {
             size_t currentMl=0;
             const BYTE* const match = ddsBase + matchIndex;
             assert(match+4 <= ddsEnd);