]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
dynamic bucket sizes
authorYann Collet <yann.collet.73@gmail.com>
Sat, 8 Feb 2025 00:59:34 +0000 (16:59 -0800)
committerYann Collet <cyan@fb.com>
Mon, 10 Feb 2025 18:46:37 +0000 (10:46 -0800)
lib/compress/zstd_ldm.c

index 6f866ea16a42f747cd818c5311fe80dfa69a7887..39f23c56561f04a72c927c4e17e743bd37a16a11 100644 (file)
@@ -16,7 +16,7 @@
 #include "zstd_double_fast.h"   /* ZSTD_fillDoubleHashTable() */
 #include "zstd_ldm_geartab.h"
 
-#define LDM_BUCKET_SIZE_LOG 3
+#define LDM_BUCKET_SIZE_LOG 4
 #define LDM_MIN_MATCH_LENGTH 64
 #define LDM_HASH_RLOG 7
 
@@ -138,7 +138,6 @@ void ZSTD_ldm_adjustParameters(ldmParams_t* params,
     params->windowLog = cParams->windowLog;
     ZSTD_STATIC_ASSERT(LDM_BUCKET_SIZE_LOG <= ZSTD_LDM_BUCKETSIZELOG_MAX);
     DEBUGLOG(4, "ZSTD_ldm_adjustParameters");
-    if (!params->bucketSizeLog) params->bucketSizeLog = LDM_BUCKET_SIZE_LOG;
     if (params->hashRateLog == 0) {
         assert(1 <= (int)cParams->strategy && (int)cParams->strategy <= 9);
         /* mapping: strat1 -> rate8 ... strat9 -> rate4*/
@@ -152,6 +151,15 @@ void ZSTD_ldm_adjustParameters(ldmParams_t* params,
         params->minMatchLength = (params->hashRateLog < 6) ?
                                 LDM_MIN_MATCH_LENGTH :
                                 LDM_MIN_MATCH_LENGTH * 2;
+        if (cParams->strategy >= ZSTD_btultra2)
+            params->minMatchLength /= 2;
+    }
+    if (params->bucketSizeLog==0) {
+        params->bucketSizeLog = LDM_BUCKET_SIZE_LOG;
+        if (cParams->strategy > ZSTD_lazy) {
+            params->bucketSizeLog += (U32)cParams->strategy - (U32)ZSTD_lazy;
+        }
+        params->bucketSizeLog = MIN(params->bucketSizeLog, ZSTD_LDM_BUCKETSIZELOG_MAX);
     }
     params->bucketSizeLog = MIN(params->bucketSizeLog, params->hashLog);
 }