Don't shrink window log in ZSTD_getCParams()
Treat ZSTD_getCParams() and ZSTD_adjustCParams() in the same way we treat streaming compression. Choose parameters based on the dictionary size + source size, and assume the source size is small if unkown. But, don't shrink the window log down in ZSTD_adjustCParams_internal().
This commit is contained in:
@@ -1189,17 +1189,13 @@ ZSTD_adjustCParams_internal(ZSTD_compressionParameters cPar,
|
|||||||
assert(ZSTD_checkCParams(cPar)==0);
|
assert(ZSTD_checkCParams(cPar)==0);
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
|
case ZSTD_cpm_unknown:
|
||||||
case ZSTD_cpm_noAttachDict:
|
case ZSTD_cpm_noAttachDict:
|
||||||
/* If we don't know the source size, don't make any
|
/* If we don't know the source size, don't make any
|
||||||
* assumptions about it. We will already have selected
|
* assumptions about it. We will already have selected
|
||||||
* smaller parameters if a dictionary is in use.
|
* smaller parameters if a dictionary is in use.
|
||||||
*/
|
*/
|
||||||
break;
|
break;
|
||||||
case ZSTD_cpm_unknown:
|
|
||||||
/* Keep the legacy behavior of assuming small source
|
|
||||||
* sizes when the cparam mode is unkown.
|
|
||||||
*/
|
|
||||||
/* fall-through */
|
|
||||||
case ZSTD_cpm_createCDict:
|
case ZSTD_cpm_createCDict:
|
||||||
/* Assume a small source size when creating a dictionary
|
/* Assume a small source size when creating a dictionary
|
||||||
* with an unkown source size.
|
* with an unkown source size.
|
||||||
|
|||||||
@@ -3051,6 +3051,32 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
|||||||
free(dict);
|
free(dict);
|
||||||
}
|
}
|
||||||
DISPLAYLEVEL(3, "OK \n");
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
|
DISPLAYLEVEL(3, "test%3i : ZSTD_getCParams() + dictionary ", testNb++);
|
||||||
|
{
|
||||||
|
ZSTD_compressionParameters const medium = ZSTD_getCParams(1, 16*1024-1, 0);
|
||||||
|
ZSTD_compressionParameters const large = ZSTD_getCParams(1, 128*1024-1, 0);
|
||||||
|
ZSTD_compressionParameters const smallDict = ZSTD_getCParams(1, 0, 400);
|
||||||
|
ZSTD_compressionParameters const mediumDict = ZSTD_getCParams(1, 0, 10000);
|
||||||
|
ZSTD_compressionParameters const largeDict = ZSTD_getCParams(1, 0, 100000);
|
||||||
|
|
||||||
|
assert(!memcmp(&smallDict, &mediumDict, sizeof(smallDict)));
|
||||||
|
assert(!memcmp(&medium, &mediumDict, sizeof(medium)));
|
||||||
|
assert(!memcmp(&large, &largeDict, sizeof(large)));
|
||||||
|
}
|
||||||
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
|
DISPLAYLEVEL(3, "test%3i : ZSTD_adjustCParams() + dictionary ", testNb++);
|
||||||
|
{
|
||||||
|
ZSTD_compressionParameters const cParams = ZSTD_getCParams(1, 0, 0);
|
||||||
|
ZSTD_compressionParameters const smallDict = ZSTD_adjustCParams(cParams, 0, 400);
|
||||||
|
ZSTD_compressionParameters const smallSrcAndDict = ZSTD_adjustCParams(cParams, 500, 400);
|
||||||
|
|
||||||
|
assert(smallSrcAndDict.windowLog == 10);
|
||||||
|
assert(!memcmp(&cParams, &smallDict, sizeof(cParams)));
|
||||||
|
}
|
||||||
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
|
|||||||
Reference in New Issue
Block a user