]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
compress uses less memory for small blocks
authorYann Collet <yann.collet.73@gmail.com>
Wed, 2 Dec 2015 13:00:45 +0000 (14:00 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Wed, 2 Dec 2015 13:00:45 +0000 (14:00 +0100)
lib/zstd_compress.c

index e9ff1726b2e7631823be100773c194510da6c7da..6304e2b6e8ddc7a87c5a26ad05c7652c8c54293a 100644 (file)
@@ -100,8 +100,6 @@ static void ZSTD_resetSeqStore(seqStore_t* ssPtr)
 /* *************************************
 *  Context memory management
 ***************************************/
-#define WORKPLACESIZE (BLOCKSIZE*3)
-
 struct ZSTD_CCtx_s
 {
     const BYTE* nextSrc;    /* next block here to continue on current prefix */
@@ -113,6 +111,7 @@ struct ZSTD_CCtx_s
     ZSTD_parameters params;
     void* workSpace;
     size_t workSpaceSize;
+    size_t blockSize;
 
     seqStore_t seqStore;    /* sequences storage ptrs */
     U32* hashTable;
@@ -170,11 +169,14 @@ void ZSTD_validateParams(ZSTD_parameters* params)
 static size_t ZSTD_resetCCtx_advanced (ZSTD_CCtx* zc,
                                        ZSTD_parameters params)
 {
+    /* note : params considered validated here */
+    const size_t blockSize = MIN(BLOCKSIZE, (size_t)1 << params.windowLog);
+
     /* reserve table memory */
     {
         const U32 contentLog = (params.strategy == ZSTD_fast) ? 1 : params.contentLog;
         const size_t tableSpace = ((1 << contentLog) + (1 << params.hashLog)) * sizeof(U32);
-        const size_t neededSpace = tableSpace + WORKPLACESIZE;
+        const size_t neededSpace = tableSpace + (3*blockSize);
         if (zc->workSpaceSize < neededSpace)
         {
             free(zc->workSpace);
@@ -195,12 +197,13 @@ static size_t ZSTD_resetCCtx_advanced (ZSTD_CCtx* zc,
     zc->dictLimit = 0;
     zc->lowLimit = 0;
     zc->params = params;
+    zc->blockSize = blockSize;
     zc->seqStore.offsetStart = (U32*) (zc->seqStore.buffer);
-    zc->seqStore.offCodeStart = (BYTE*) (zc->seqStore.offsetStart + (BLOCKSIZE>>2));
-    zc->seqStore.litStart = zc->seqStore.offCodeStart + (BLOCKSIZE>>2);
-    zc->seqStore.litLengthStart =  zc->seqStore.litStart + BLOCKSIZE;
-    zc->seqStore.matchLengthStart = zc->seqStore.litLengthStart + (BLOCKSIZE>>2);
-    zc->seqStore.dumpsStart = zc->seqStore.matchLengthStart + (BLOCKSIZE>>2);
+    zc->seqStore.offCodeStart = (BYTE*) (zc->seqStore.offsetStart + (blockSize>>2));
+    zc->seqStore.litStart = zc->seqStore.offCodeStart + (blockSize>>2);
+    zc->seqStore.litLengthStart =  zc->seqStore.litStart + blockSize;
+    zc->seqStore.matchLengthStart = zc->seqStore.litLengthStart + (blockSize>>2);
+    zc->seqStore.dumpsStart = zc->seqStore.matchLengthStart + (blockSize>>2);
 
     return 0;
 }
@@ -1919,7 +1922,7 @@ static size_t ZSTD_compress_generic (ZSTD_CCtx* ctxPtr,
                                         void* dst, size_t maxDstSize,
                                   const void* src, size_t srcSize)
 {
-    size_t blockSize = BLOCKSIZE;
+    size_t blockSize = ctxPtr->blockSize;
     size_t remaining = srcSize;
     const BYTE* ip = (const BYTE*)src;
     BYTE* const ostart = (BYTE*)dst;