]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Truncate Chain at Last Possible Attempt
authorW. Felix Handte <w@felixhandte.com>
Thu, 3 Sep 2020 17:58:11 +0000 (13:58 -0400)
committerW. Felix Handte <w@felixhandte.com>
Fri, 11 Sep 2020 02:10:02 +0000 (22:10 -0400)
Make the chain table denser?

lib/compress/zstd_lazy.c

index 0b70494fa0d8213ad2d7fb25dbe611e723419029..edba73d0537ff19dcfca7844b7596981ff6268ca 100644 (file)
@@ -487,7 +487,9 @@ void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const B
     U32 const chainMask = chainSize - 1;
     U32 idx = ms->nextToUpdate;
     U32 const minChain = chainSize < target ? target - chainSize : idx;
-    U32 bucketSize = 1 << ZSTD_LAZY_DDSS_BUCKET_LOG;
+    U32 const bucketSize = 1 << ZSTD_LAZY_DDSS_BUCKET_LOG;
+    U32 const nbAttempts = (1 << ms->cParams.searchLog) - bucketSize + 1;
+    U32 const chainLimit = nbAttempts > 255 ? 255 : nbAttempts;
     U32* const chains = (U32*)malloc(chainSize * sizeof(U32));
     assert(chains != NULL);
     assert(idx != 0);
@@ -517,7 +519,7 @@ void ZSTD_dedicatedDictSearch_lazy_loadDictionary(ZSTD_matchState_t* ms, const B
             while (i) {
                 chainTable[chainPos++] = i;
                 count++;
-                if (i < minChain || count >= 255) {
+                if (i < minChain || count >= chainLimit) {
                     break;
                 }
                 i = chains[i & chainMask];