slightly improved compression ratio at levels 3 & 4

The compression ratio benefits are small but consistent, i.e. always positive.
On `silesia.tar` corpus, this modification saves ~75 KB at level 3.
The measured speed cost is negligible, i.e. below noise level, between 0 and -1%.
This commit is contained in:
Yann Collet
2024-10-17 09:37:23 -07:00
parent 18a42190c2
commit 6326775166
+13 -9
View File
@@ -252,19 +252,23 @@ _cleanup:
_search_next_long: _search_next_long:
/* check prefix long +1 match */ /* short match found: let's check for a longer one */
mLength = ZSTD_count(ip+4, matchs0+4, iend) + 4;
/* check long match at +1 position */
if (idxl1 > prefixLowestIndex) { if (idxl1 > prefixLowestIndex) {
if (MEM_read64(matchl1) == MEM_read64(ip1)) { if (MEM_read64(matchl1) == MEM_read64(ip1)) {
ip = ip1; size_t const llen = ZSTD_count(ip1+8, matchl1+8, iend) + 8;
mLength = ZSTD_count(ip+8, matchl1+8, iend) + 8; if (llen > mLength) {
offset = (U32)(ip-matchl1); ip = ip1;
while (((ip>anchor) & (matchl1>prefixLowest)) && (ip[-1] == matchl1[-1])) { ip--; matchl1--; mLength++; } /* catch up */ mLength = llen;
goto _match_found; offset = (U32)(ip-matchl1);
} while (((ip>anchor) & (matchl1>prefixLowest)) && (ip[-1] == matchl1[-1])) { ip--; matchl1--; mLength++; } /* catch up */
goto _match_found;
} }
} }
/* if no long +1 match, explore the short match we found */ /* validate short match previously found */
mLength = ZSTD_count(ip+4, matchs0+4, iend) + 4;
offset = (U32)(ip - matchs0); offset = (U32)(ip - matchs0);
while (((ip>anchor) & (matchs0>prefixLowest)) && (ip[-1] == matchs0[-1])) { ip--; matchs0--; mLength++; } /* catch up */ while (((ip>anchor) & (matchs0>prefixLowest)) && (ip[-1] == matchs0[-1])) { ip--; matchs0--; mLength++; } /* catch up */