]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
dynamically adjust hratelog and ldmml based on strategy
authorYann Collet <yann.collet.73@gmail.com>
Fri, 7 Feb 2025 23:58:42 +0000 (15:58 -0800)
committerYann Collet <cyan@fb.com>
Mon, 10 Feb 2025 18:46:37 +0000 (10:46 -0800)
lib/compress/zstd_ldm.c

index 42b38c0d0e46446337285c2dc63a331ba984e978..6f866ea16a42f747cd818c5311fe80dfa69a7887 100644 (file)
@@ -139,15 +139,19 @@ void ZSTD_ldm_adjustParameters(ldmParams_t* params,
     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->minMatchLength) params->minMatchLength = LDM_MIN_MATCH_LENGTH;
+    if (params->hashRateLog == 0) {
+        assert(1 <= (int)cParams->strategy && (int)cParams->strategy <= 9);
+        /* mapping: strat1 -> rate8 ... strat9 -> rate4*/
+        params->hashRateLog = 9 - ((cParams->strategy+1)/2);
+    }
     if (params->hashLog == 0) {
-        params->hashLog = MAX(ZSTD_HASHLOG_MIN, params->windowLog - LDM_HASH_RLOG);
+        params->hashLog = MAX(ZSTD_HASHLOG_MIN, params->windowLog - params->hashRateLog);
         assert(params->hashLog <= ZSTD_HASHLOG_MAX);
     }
-    if (params->hashRateLog == 0) {
-        params->hashRateLog = params->windowLog < params->hashLog
-                                   ? 0
-                                   : params->windowLog - params->hashLog;
+    if (params->minMatchLength == 0) {
+        params->minMatchLength = (params->hashRateLog < 6) ?
+                                LDM_MIN_MATCH_LENGTH :
+                                LDM_MIN_MATCH_LENGTH * 2;
     }
     params->bucketSizeLog = MIN(params->bucketSizeLog, params->hashLog);
 }