diff --git a/.circleci/config.yml b/.circleci/config.yml
index 42e4042d..ca153d83 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,33 +1,14 @@
version: 2
-references:
- # Install the dependencies required for tests.
- # Add the step "- *install-dependencies" to the beginning of your job to run
- # this command.
- install-dependencies: &install-dependencies
- run:
- name: Install dependencies
- # TODO: We can split these dependencies up by job to reduce installation
- # time.
- command: |
- sudo dpkg --add-architecture i386
- sudo apt-get -y -qq update
- sudo apt-get -y install \
- gcc-multilib-powerpc-linux-gnu gcc-arm-linux-gnueabi \
- libc6-dev-armel-cross gcc-aarch64-linux-gnu libc6-dev-arm64-cross \
- libc6-dev-ppc64-powerpc-cross zstd gzip coreutils \
- libcurl4-openssl-dev
-
jobs:
# the first half of the jobs are in this test
short-tests-0:
# TODO: Create a small custom docker image with all the dependencies we need
# preinstalled to reduce installation time.
docker:
- - image: circleci/buildpack-deps:bionic
+ - image: fbopensource/zstd-circleci-primary:0.0.1
steps:
- checkout
- - *install-dependencies
- run:
name: Test
command: |
@@ -41,10 +22,9 @@ jobs:
# the second half of the jobs are in this test
short-tests-1:
docker:
- - image: circleci/buildpack-deps:bionic
+ - image: fbopensource/zstd-circleci-primary:0.0.1
steps:
- checkout
- - *install-dependencies
- run:
name: Test
command: |
@@ -61,12 +41,11 @@ jobs:
# tagged release.
publish-github-release:
docker:
- - image: circleci/buildpack-deps:bionic
+ - image: fbopensource/zstd-circleci-primary:0.0.1
environment:
CIRCLE_ARTIFACTS: /tmp/circleci-artifacts
steps:
- checkout
- - *install-dependencies
- run:
name: Publish
command: |
@@ -86,12 +65,11 @@ jobs:
# This step should only be run in a cron job
regression-test:
docker:
- - image: circleci/buildpack-deps:bionic
+ - image: fbopensource/zstd-circleci-primary:0.0.1
environment:
CIRCLE_ARTIFACTS: /tmp/circleci-artifacts
steps:
- checkout
- - *install-dependencies
# Restore the cached resources.
- restore_cache:
# We try our best to bust the cache when the data changes by hashing
diff --git a/.circleci/images/primary/Dockerfile b/.circleci/images/primary/Dockerfile
new file mode 100644
index 00000000..dd800415
--- /dev/null
+++ b/.circleci/images/primary/Dockerfile
@@ -0,0 +1,9 @@
+FROM circleci/buildpack-deps:bionic
+
+RUN sudo dpkg --add-architecture i386
+RUN sudo apt-get -y -qq update
+RUN sudo apt-get -y install \
+ gcc-multilib-powerpc-linux-gnu gcc-arm-linux-gnueabi \
+ libc6-dev-armel-cross gcc-aarch64-linux-gnu libc6-dev-arm64-cross \
+ libc6-dev-ppc64-powerpc-cross zstd gzip coreutils \
+ libcurl4-openssl-dev
diff --git a/build/VS2010/libzstd-dll/libzstd-dll.vcxproj b/build/VS2010/libzstd-dll/libzstd-dll.vcxproj
index 2c4f126e..bcde584b 100644
--- a/build/VS2010/libzstd-dll/libzstd-dll.vcxproj
+++ b/build/VS2010/libzstd-dll/libzstd-dll.vcxproj
@@ -209,7 +209,6 @@
@@ -78,11 +68,7 @@unsigned ZSTD_versionNumber(void); /**< to check runtime library version */
-Default constant
- -Constants
- -Simple API
+Simple API
size_t ZSTD_compress( void* dst, size_t dstCapacity, const void* src, size_t srcSize, @@ -152,7 +138,7 @@ const char* ZSTD_getErrorName(size_t code); /*!< provides readable strin int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed */ int ZSTD_maxCLevel(void); /*!< maximum compression level available */
-Explicit context
+Explicit context
Compression context
When compressing many times, it is recommended to allocate a context just once, and re-use it for each successive compression operation. @@ -189,7 +175,7 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx);
-Advanced compression API
+Advanced compression API
typedef enum { ZSTD_fast=1, ZSTD_dfast=2, @@ -424,7 +410,7 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx);
-Advanced decompression API
+Advanced decompression API
typedef enum { @@ -472,7 +458,7 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx);
-Streaming
+Streaming
typedef struct ZSTD_inBuffer_s { const void* src; /**< start of input buffer */ @@ -486,7 +472,7 @@ size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); size_t pos; /**< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size */ } ZSTD_outBuffer;
-Streaming compression - HowTo
+Streaming compression - HowTo
A ZSTD_CStream object is required to track streaming operation. Use ZSTD_createCStream() and ZSTD_freeCStream() to create/release resources. ZSTD_CStream objects can be reused multiple times on consecutive compression operations. @@ -592,31 +578,28 @@ size_t ZSTD_freeCStream(ZSTD_CStream* zcs);size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */
-size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block in all circumstances. */ +size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block. */
-This is a legacy streaming API, and can be replaced by ZSTD_CCtx_reset() and
ZSTD_compressStream2(). It is redundant, but is still fully supported. - Advanced parameters and dictionary compression can only be used through the - new API. -- -Equivalent to:
+size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel); +/*! + * Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue). + * NOTE: The return value is different. ZSTD_compressStream() returns a hint for + * the next read size (if non-zero and not an error). ZSTD_compressStream2() + * returns the minimum nb of bytes left to flush (if non-zero and not an error). + */ +size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */ +size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */ +size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); ++ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any) ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); -
-Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue).
NOTE: The return value is different. ZSTD_compressStream() returns a hint for - the next read size (if non-zero and not an error). ZSTD_compressStream2() - returns the number of bytes left to flush (if non-zero and not an error). - -- -Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush).
- -Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end).
- -Streaming decompression - HowTo
+Streaming decompression - HowTo
A ZSTD_DStream object is required to track streaming operations. Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources. ZSTD_DStream objects can be re-used multiple times. @@ -652,7 +635,7 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds);
size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */
-Simple dictionary API
+Simple dictionary API
size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx, void* dst, size_t dstCapacity, @@ -678,7 +661,7 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds); Note : When `dict == NULL || dictSize < 8` no dictionary is used.
-Bulk processing dictionary API
+Bulk processing dictionary API
ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize, int compressionLevel); @@ -721,7 +704,7 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds); Recommended when same dictionary is used multiple times.
-Dictionary helper functions
+Dictionary helper functions
unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize);Provides the dictID stored within dictionary. @@ -747,7 +730,7 @@ size_t ZSTD_freeDStream(ZSTD_DStream* zds); When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code.
-Advanced dictionary and prefix API
+Advanced dictionary and prefix API
This API allows dictionaries to be used with ZSTD_compress2(), ZSTD_compressStream2(), and ZSTD_decompress(). Dictionaries are sticky, and only reset with the context is reset with ZSTD_reset_parameters or @@ -865,15 +848,7 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); Note that object memory usage can evolve (increase or decrease) over time.
-ADVANCED AND EXPERIMENTAL FUNCTIONS
- The definitions in the following section are considered experimental. - They are provided for advanced scenarios. - They should never be used with a dynamic library, as prototypes may change in the future. - Use them only in association with static linking. - -- -experimental API (static linking only)
+experimental API (static linking only)
The following symbols and constants are not planned to join "stable API" status in the near future. They can still change in future versions. @@ -971,7 +946,7 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); ZSTD_lcm_uncompressed = 2, /**< Always emit uncompressed literals. */ } ZSTD_literalCompressionMode_e;
-Frame size functions
+Frame size functions
unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize);`src` should point to the start of a series of ZSTD encoded and/or skippable frames @@ -996,7 +971,8 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); however it does mean that all frame data must be present and valid.
-ZSTD_decompressBound() :
`src` should point to the start of a series of ZSTD encoded and/or skippable frames +unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize); ++`src` should point to the start of a series of ZSTD encoded and/or skippable frames `srcSize` must be the _exact_ size of this series (i.e. there should be a frame boundary at `src + srcSize`) @return : - upper-bound for the decompressed size of all data in all successive frames @@ -1008,7 +984,7 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); note 3 : when the decompressed size field isn't available, the upper-bound for that frame is calculated by: upper-bound = # blocks * min(128 KB, Window_Size) -
size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX. @@ -1016,7 +992,7 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); or an error code (if srcSize is too small)
-Memory management
+Memory management
size_t ZSTD_estimateCCtxSize(int compressionLevel); size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams); @@ -1096,7 +1072,7 @@ static ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL }; /**< t
-Advanced compression functions
+Advanced compression functions
ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel);Create a digested dictionary for compression @@ -1241,7 +1217,7 @@ size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);
-Advanced decompression functions
+Advanced decompression functions
unsigned ZSTD_isFrame(const void* buffer, size_t size);Tells if the content of `buffer` starts with a valid Frame Identifier. @@ -1303,7 +1279,7 @@ size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);
-Advanced streaming functions
Warning : most of these functions are now redundant with the Advanced API. +Advanced streaming functions
Warning : most of these functions are now redundant with the Advanced API. Once Advanced API reaches "stable" status, redundant functions will be deprecated, and then at some point removed.@@ -1432,14 +1408,14 @@ size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict); */ size_t ZSTD_resetDStream(ZSTD_DStream* zds);
-Buffer-less and synchronous inner streaming functions
+Buffer-less and synchronous inner streaming functions
This is an advanced API, giving full control over buffer management, for users which need direct control over memory. But it's also a complex one, with several restrictions, documented below. Prefer normal streaming API for an easier experience.-Buffer-less streaming compression (synchronous mode)
+Buffer-less streaming compression (synchronous mode)
A ZSTD_CCtx object is required to track streaming operations. Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource. ZSTD_CCtx object can be re-used multiple times within successive compression operations. @@ -1475,7 +1451,7 @@ size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize); /* compression parameters are already set within cdict. pledgedSrcSize must be correct. If srcSize is not known, use macro ZSTD_CONTENTSIZE_UNKNOWN */ size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**< note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */
-Buffer-less streaming decompression (synchronous mode)
+Buffer-less streaming decompression (synchronous mode)
A ZSTD_DCtx object is required to track streaming operations. Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it. A ZSTD_DCtx object can be re-used multiple times. @@ -1557,23 +1533,21 @@ typedef struct { unsigned checksumFlag; } ZSTD_frameHeader;
-ZSTD_getFrameHeader() :
decode Frame Header, or requires larger `srcSize`. +size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ +/*! ZSTD_getFrameHeader_advanced() : + * same as ZSTD_getFrameHeader(), + * with added capability to select a format (like ZSTD_f_zstd1_magicless) */ +size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); +size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ +- -decode Frame Header, or requires larger `srcSize`. @return : 0, `zfhPtr` is correctly filled, >0, `srcSize` is too small, value is wanted `srcSize` amount, or an error code, which can be tested using ZSTD_isError() -
size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */ -
-size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format); -size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize); /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */ -same as ZSTD_getFrameHeader(), - with added capability to select a format (like ZSTD_f_zstd1_magicless)
typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e;
-Block level API
+Block level API
Frame metadata cost is typically ~18 bytes, which can be non-negligible for very small blocks (< 100 bytes). User will have to take in charge required information to regenerate data, such as compressed and content sizes. diff --git a/lib/compress/zstd_opt.c b/lib/compress/zstd_opt.c index 12b56c70..cf46e750 100644 --- a/lib/compress/zstd_opt.c +++ b/lib/compress/zstd_opt.c @@ -506,9 +506,11 @@ static U32 ZSTD_insertBt1( } } *smallerPtr = *largerPtr = 0; - if (bestLength > 384) return MIN(192, (U32)(bestLength - 384)); /* speed optimization */ - assert(matchEndIdx > current + 8); - return matchEndIdx - (current + 8); + { U32 positions = 0; + if (bestLength > 384) positions = MIN(192, (U32)(bestLength - 384)); /* speed optimization */ + assert(matchEndIdx > current + 8); + return MAX(positions, matchEndIdx - (current + 8)); + } } FORCE_INLINE_TEMPLATE diff --git a/lib/zstd.h b/lib/zstd.h index 53470c18..0cc72b4e 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -82,16 +82,16 @@ ZSTDLIB_API unsigned ZSTD_versionNumber(void); /**< to check runtime library v #define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION) ZSTDLIB_API const char* ZSTD_versionString(void); /* requires v1.3.0+ */ -/*************************************** -* Default constant -***************************************/ +/* ************************************* + * Default constant + ***************************************/ #ifndef ZSTD_CLEVEL_DEFAULT # define ZSTD_CLEVEL_DEFAULT 3 #endif -/*************************************** -* Constants -***************************************/ +/* ************************************* + * Constants + ***************************************/ /* All magic numbers are supposed read/written to/from files/memory using little-endian convention */ #define ZSTD_MAGICNUMBER 0xFD2FB528 /* valid since v0.8.0 */ @@ -657,17 +657,33 @@ ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx, ZSTD_inBuffer* input, ZSTD_EndDirective endOp); -ZSTDLIB_API size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */ -ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block in all circumstances. */ -/******************************************************************************* - * This is a legacy streaming API, and can be replaced by ZSTD_CCtx_reset() and - * ZSTD_compressStream2(). It is redundant, but is still fully supported. +/* These buffer sizes are softly recommended. + * They are not required : ZSTD_compressStream*() happily accepts any buffer size, for both input and output. + * Respecting the recommended size just makes it a bit easier for ZSTD_compressStream*(), + * reducing the amount of memory shuffling and buffering, resulting in minor performance savings. + * + * However, note that these recommendations are from the perspective of a C caller program. + * If the streaming interface is invoked from some other language, + * especially managed ones such as Java or Go, through a foreign function interface such as jni or cgo, + * a major performance rule is to reduce crossing such interface to an absolute minimum. + * It's not rare that performance ends being spent more into the interface, rather than compression itself. + * In which cases, prefer using large buffers, as large as practical, + * for both input and output, to reduce the nb of roundtrips. + */ +ZSTDLIB_API size_t ZSTD_CStreamInSize(void); /**< recommended size for input buffer */ +ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block. */ + + +/* ***************************************************************************** + * This following is a legacy streaming API. + * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2(). + * It is redundant, but remains fully supported. * Advanced parameters and dictionary compression can only be used through the * new API. ******************************************************************************/ -/** +/*! * Equivalent to: * * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only); @@ -675,16 +691,16 @@ ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel); */ ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel); -/** +/*! * Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue). * NOTE: The return value is different. ZSTD_compressStream() returns a hint for * the next read size (if non-zero and not an error). ZSTD_compressStream2() - * returns the number of bytes left to flush (if non-zero and not an error). + * returns the minimum nb of bytes left to flush (if non-zero and not an error). */ ZSTDLIB_API size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input); -/** Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */ +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */ ZSTDLIB_API size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); -/** Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */ +/*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */ ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output); @@ -969,7 +985,7 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict); #endif /* ZSTD_H_235446 */ -/**************************************************************************************** +/* ************************************************************************************** * ADVANCED AND EXPERIMENTAL FUNCTIONS **************************************************************************************** * The definitions in the following section are considered experimental. @@ -1162,7 +1178,7 @@ typedef enum { * however it does mean that all frame data must be present and valid. */ ZSTDLIB_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize); -/** ZSTD_decompressBound() : +/*! ZSTD_decompressBound() : * `src` should point to the start of a series of ZSTD encoded and/or skippable frames * `srcSize` must be the _exact_ size of this series * (i.e. there should be a frame boundary at `src + srcSize`) @@ -1843,7 +1859,7 @@ typedef struct { unsigned checksumFlag; } ZSTD_frameHeader; -/** ZSTD_getFrameHeader() : +/*! ZSTD_getFrameHeader() : * decode Frame Header, or requires larger `srcSize`. * @return : 0, `zfhPtr` is correctly filled, * >0, `srcSize` is too small, value is wanted `srcSize` amount, diff --git a/programs/README.md b/programs/README.md index afbebaa1..d9ef5dd2 100644 --- a/programs/README.md +++ b/programs/README.md @@ -37,7 +37,7 @@ There are however other Makefile targets that create different variations of CLI `.gz` support is automatically enabled when `zlib` library is detected at build time. It's possible to disable `.gz` support, by setting `HAVE_ZLIB=0`. Example : `make zstd HAVE_ZLIB=0` - It's also possible to force compilation with zlib support, `using HAVE_ZLIB=1`. + It's also possible to force compilation with zlib support, using `HAVE_ZLIB=1`. In which case, linking stage will fail if `zlib` library cannot be found. This is useful to prevent silent feature disabling. @@ -45,7 +45,7 @@ There are however other Makefile targets that create different variations of CLI This is ordered through commands `--format=xz` and `--format=lzma` respectively. Alternatively, symlinks named `xz`, `unxz`, `lzma`, or `unlzma` will mimic intended behavior. `.xz` and `.lzma` support is automatically enabled when `lzma` library is detected at build time. - It's possible to disable `.xz` and `.lzma` support, by setting `HAVE_LZMA=0` . + It's possible to disable `.xz` and `.lzma` support, by setting `HAVE_LZMA=0`. Example : `make zstd HAVE_LZMA=0` It's also possible to force compilation with lzma support, using `HAVE_LZMA=1`. In which case, linking stage will fail if `lzma` library cannot be found. diff --git a/programs/fileio.c b/programs/fileio.c index dc8479ab..3c45a986 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -1165,6 +1165,8 @@ FIO_compressFilename_internal(FIO_prefs_t* const prefs, const char* dstFileName, const char* srcFileName, int compressionLevel) { + UTIL_time_t const timeStart = UTIL_getTime(); + clock_t const cpuStart = clock(); U64 readsize = 0; U64 compressedfilesize = 0; U64 const fileSize = UTIL_getFileSize(srcFileName); @@ -1217,6 +1219,15 @@ FIO_compressFilename_internal(FIO_prefs_t* const prefs, (unsigned long long)readsize, (unsigned long long) compressedfilesize, dstFileName); + /* Elapsed Time and CPU Load */ + { clock_t const cpuEnd = clock(); + double const cpuLoad_s = (double)(cpuEnd - cpuStart) / CLOCKS_PER_SEC; + U64 const timeLength_ns = UTIL_clockSpanNano(timeStart); + double const timeLength_s = (double)timeLength_ns / 1000000000; + double const cpuLoad_pct = (cpuLoad_s / timeLength_s) * 100; + DISPLAYLEVEL(4, "%-20s : Completed in %.2f sec (cpu load : %.0f%%)\n", + srcFileName, timeLength_s, cpuLoad_pct); + } return 0; } @@ -1339,15 +1350,12 @@ int FIO_compressFilename(FIO_prefs_t* const prefs, const char* dictFileName, int compressionLevel, ZSTD_compressionParameters comprParams) { - clock_t const start = clock(); U64 const fileSize = UTIL_getFileSize(srcFileName); U64 const srcSize = (fileSize == UTIL_FILESIZE_UNKNOWN) ? ZSTD_CONTENTSIZE_UNKNOWN : fileSize; cRess_t const ress = FIO_createCResources(prefs, dictFileName, compressionLevel, srcSize, comprParams); int const result = FIO_compressFilename_srcFile(prefs, ress, dstFileName, srcFileName, compressionLevel); - double const seconds = (double)(clock() - start) / CLOCKS_PER_SEC; - DISPLAYLEVEL(4, "Completed in %.2f sec \n", seconds); FIO_freeCResources(ress); return result; diff --git a/tests/regression/results.csv b/tests/regression/results.csv index 7ac94f20..a7c97d88 100644 --- a/tests/regression/results.csv +++ b/tests/regression/results.csv @@ -11,10 +11,10 @@ silesia.tar, level 6, compress silesia.tar, level 7, compress simple, 4606658 silesia.tar, level 9, compress simple, 4554098 silesia.tar, level 13, compress simple, 4491702 -silesia.tar, level 16, compress simple, 4381277 -silesia.tar, level 19, compress simple, 4281514 +silesia.tar, level 16, compress simple, 4381284 +silesia.tar, level 19, compress simple, 4281512 silesia.tar, uncompressed literals, compress simple, 4875008 -silesia.tar, uncompressed literals optimal, compress simple, 4281514 +silesia.tar, uncompressed literals optimal, compress simple, 4281512 silesia.tar, huffman literals, compress simple, 6186038 silesia, level -5, compress cctx, 6737567 silesia, level -3, compress cctx, 6444663 @@ -28,7 +28,7 @@ silesia, level 6, compress silesia, level 7, compress cctx, 4596234 silesia, level 9, compress cctx, 4543862 silesia, level 13, compress cctx, 4482073 -silesia, level 16, compress cctx, 4377391 +silesia, level 16, compress cctx, 4377389 silesia, level 19, compress cctx, 4293262 silesia, long distance mode, compress cctx, 4862377 silesia, multithreaded, compress cctx, 4862377 @@ -92,7 +92,7 @@ silesia, level 6, zstdcli, silesia, level 7, zstdcli, 4596282 silesia, level 9, zstdcli, 4543910 silesia, level 13, zstdcli, 4482121 -silesia, level 16, zstdcli, 4377439 +silesia, level 16, zstdcli, 4377437 silesia, level 19, zstdcli, 4293310 silesia, long distance mode, zstdcli, 4853437 silesia, multithreaded, zstdcli, 4862425 @@ -102,7 +102,7 @@ silesia, small hash log, zstdcli, silesia, small chain log, zstdcli, 4931141 silesia, explicit params, zstdcli, 4815380 silesia, uncompressed literals, zstdcli, 5155472 -silesia, uncompressed literals optimal, zstdcli, 4325475 +silesia, uncompressed literals optimal, zstdcli, 4325482 silesia, huffman literals, zstdcli, 5331158 silesia, multithreaded with advanced params, zstdcli, 5155472 silesia.tar, level -5, zstdcli, 6738906 @@ -117,8 +117,8 @@ silesia.tar, level 6, zstdcli, silesia.tar, level 7, zstdcli, 4608342 silesia.tar, level 9, zstdcli, 4554700 silesia.tar, level 13, zstdcli, 4491706 -silesia.tar, level 16, zstdcli, 4381281 -silesia.tar, level 19, zstdcli, 4281518 +silesia.tar, level 16, zstdcli, 4381288 +silesia.tar, level 19, zstdcli, 4281516 silesia.tar, no source size, zstdcli, 4875132 silesia.tar, long distance mode, zstdcli, 4866975 silesia.tar, multithreaded, zstdcli, 4875136 @@ -128,7 +128,7 @@ silesia.tar, small hash log, zstdcli, silesia.tar, small chain log, zstdcli, 4943259 silesia.tar, explicit params, zstdcli, 4839202 silesia.tar, uncompressed literals, zstdcli, 5158134 -silesia.tar, uncompressed literals optimal, zstdcli, 4321098 +silesia.tar, uncompressed literals optimal, zstdcli, 4321099 silesia.tar, huffman literals, zstdcli, 5347560 silesia.tar, multithreaded with advanced params, zstdcli, 5158134 github, level -5, zstdcli, 207285 @@ -182,7 +182,7 @@ silesia, level 6, advanced silesia, level 7, advanced one pass, 4596234 silesia, level 9, advanced one pass, 4543862 silesia, level 13, advanced one pass, 4482073 -silesia, level 16, advanced one pass, 4377391 +silesia, level 16, advanced one pass, 4377389 silesia, level 19, advanced one pass, 4293262 silesia, no source size, advanced one pass, 4862377 silesia, long distance mode, advanced one pass, 4853389 @@ -193,7 +193,7 @@ silesia, small hash log, advanced silesia, small chain log, advanced one pass, 4931093 silesia, explicit params, advanced one pass, 4815369 silesia, uncompressed literals, advanced one pass, 5155424 -silesia, uncompressed literals optimal, advanced one pass, 4325427 +silesia, uncompressed literals optimal, advanced one pass, 4325434 silesia, huffman literals, advanced one pass, 5326210 silesia, multithreaded with advanced params, advanced one pass, 5155424 silesia.tar, level -5, advanced one pass, 6738558 @@ -208,8 +208,8 @@ silesia.tar, level 6, advanced silesia.tar, level 7, advanced one pass, 4606658 silesia.tar, level 9, advanced one pass, 4554098 silesia.tar, level 13, advanced one pass, 4491702 -silesia.tar, level 16, advanced one pass, 4381277 -silesia.tar, level 19, advanced one pass, 4281514 +silesia.tar, level 16, advanced one pass, 4381284 +silesia.tar, level 19, advanced one pass, 4281512 silesia.tar, no source size, advanced one pass, 4875008 silesia.tar, long distance mode, advanced one pass, 4861218 silesia.tar, multithreaded, advanced one pass, 4874631 @@ -219,7 +219,7 @@ silesia.tar, small hash log, advanced silesia.tar, small chain log, advanced one pass, 4943255 silesia.tar, explicit params, advanced one pass, 4829974 silesia.tar, uncompressed literals, advanced one pass, 5157992 -silesia.tar, uncompressed literals optimal, advanced one pass, 4321094 +silesia.tar, uncompressed literals optimal, advanced one pass, 4321095 silesia.tar, huffman literals, advanced one pass, 5347283 silesia.tar, multithreaded with advanced params, advanced one pass, 5158545 github, level -5, advanced one pass, 205285 @@ -274,7 +274,7 @@ silesia, level 6, advanced silesia, level 7, advanced one pass small out, 4596234 silesia, level 9, advanced one pass small out, 4543862 silesia, level 13, advanced one pass small out, 4482073 -silesia, level 16, advanced one pass small out, 4377391 +silesia, level 16, advanced one pass small out, 4377389 silesia, level 19, advanced one pass small out, 4293262 silesia, no source size, advanced one pass small out, 4862377 silesia, long distance mode, advanced one pass small out, 4853389 @@ -285,7 +285,7 @@ silesia, small hash log, advanced silesia, small chain log, advanced one pass small out, 4931093 silesia, explicit params, advanced one pass small out, 4815369 silesia, uncompressed literals, advanced one pass small out, 5155424 -silesia, uncompressed literals optimal, advanced one pass small out, 4325427 +silesia, uncompressed literals optimal, advanced one pass small out, 4325434 silesia, huffman literals, advanced one pass small out, 5326210 silesia, multithreaded with advanced params, advanced one pass small out, 5155424 silesia.tar, level -5, advanced one pass small out, 6738558 @@ -300,8 +300,8 @@ silesia.tar, level 6, advanced silesia.tar, level 7, advanced one pass small out, 4606658 silesia.tar, level 9, advanced one pass small out, 4554098 silesia.tar, level 13, advanced one pass small out, 4491702 -silesia.tar, level 16, advanced one pass small out, 4381277 -silesia.tar, level 19, advanced one pass small out, 4281514 +silesia.tar, level 16, advanced one pass small out, 4381284 +silesia.tar, level 19, advanced one pass small out, 4281512 silesia.tar, no source size, advanced one pass small out, 4875008 silesia.tar, long distance mode, advanced one pass small out, 4861218 silesia.tar, multithreaded, advanced one pass small out, 4874631 @@ -311,7 +311,7 @@ silesia.tar, small hash log, advanced silesia.tar, small chain log, advanced one pass small out, 4943255 silesia.tar, explicit params, advanced one pass small out, 4829974 silesia.tar, uncompressed literals, advanced one pass small out, 5157992 -silesia.tar, uncompressed literals optimal, advanced one pass small out, 4321094 +silesia.tar, uncompressed literals optimal, advanced one pass small out, 4321095 silesia.tar, huffman literals, advanced one pass small out, 5347283 silesia.tar, multithreaded with advanced params, advanced one pass small out, 5158545 github, level -5, advanced one pass small out, 205285 @@ -366,7 +366,7 @@ silesia, level 6, advanced silesia, level 7, advanced streaming, 4596234 silesia, level 9, advanced streaming, 4543862 silesia, level 13, advanced streaming, 4482073 -silesia, level 16, advanced streaming, 4377391 +silesia, level 16, advanced streaming, 4377389 silesia, level 19, advanced streaming, 4293262 silesia, no source size, advanced streaming, 4862341 silesia, long distance mode, advanced streaming, 4853389 @@ -377,7 +377,7 @@ silesia, small hash log, advanced silesia, small chain log, advanced streaming, 4931093 silesia, explicit params, advanced streaming, 4815380 silesia, uncompressed literals, advanced streaming, 5155424 -silesia, uncompressed literals optimal, advanced streaming, 4325427 +silesia, uncompressed literals optimal, advanced streaming, 4325434 silesia, huffman literals, advanced streaming, 5331110 silesia, multithreaded with advanced params, advanced streaming, 5155424 silesia.tar, level -5, advanced streaming, 6982738 @@ -392,8 +392,8 @@ silesia.tar, level 6, advanced silesia.tar, level 7, advanced streaming, 4606658 silesia.tar, level 9, advanced streaming, 4554105 silesia.tar, level 13, advanced streaming, 4491703 -silesia.tar, level 16, advanced streaming, 4381277 -silesia.tar, level 19, advanced streaming, 4281514 +silesia.tar, level 16, advanced streaming, 4381284 +silesia.tar, level 19, advanced streaming, 4281512 silesia.tar, no source size, advanced streaming, 4875006 silesia.tar, long distance mode, advanced streaming, 4861218 silesia.tar, multithreaded, advanced streaming, 4875132 @@ -403,7 +403,7 @@ silesia.tar, small hash log, advanced silesia.tar, small chain log, advanced streaming, 4943260 silesia.tar, explicit params, advanced streaming, 4830002 silesia.tar, uncompressed literals, advanced streaming, 5157995 -silesia.tar, uncompressed literals optimal, advanced streaming, 4321094 +silesia.tar, uncompressed literals optimal, advanced streaming, 4321095 silesia.tar, huffman literals, advanced streaming, 5352306 silesia.tar, multithreaded with advanced params, advanced streaming, 5158130 github, level -5, advanced streaming, 205285 @@ -458,7 +458,7 @@ silesia, level 6, old stre silesia, level 7, old streaming, 4596234 silesia, level 9, old streaming, 4543862 silesia, level 13, old streaming, 4482073 -silesia, level 16, old streaming, 4377391 +silesia, level 16, old streaming, 4377389 silesia, level 19, old streaming, 4293262 silesia, no source size, old streaming, 4862341 silesia, long distance mode, old streaming, 12000408 @@ -484,8 +484,8 @@ silesia.tar, level 6, old stre silesia.tar, level 7, old streaming, 4606658 silesia.tar, level 9, old streaming, 4554105 silesia.tar, level 13, old streaming, 4491703 -silesia.tar, level 16, old streaming, 4381277 -silesia.tar, level 19, old streaming, 4281514 +silesia.tar, level 16, old streaming, 4381284 +silesia.tar, level 19, old streaming, 4281512 silesia.tar, no source size, old streaming, 4875006 silesia.tar, long distance mode, old streaming, 12022046 silesia.tar, multithreaded, old streaming, 12022046 @@ -495,7 +495,7 @@ silesia.tar, small hash log, old stre silesia.tar, small chain log, old streaming, 12022046 silesia.tar, explicit params, old streaming, 12022046 silesia.tar, uncompressed literals, old streaming, 4875010 -silesia.tar, uncompressed literals optimal, old streaming, 4281514 +silesia.tar, uncompressed literals optimal, old streaming, 4281512 silesia.tar, huffman literals, old streaming, 6190789 silesia.tar, multithreaded with advanced params, old streaming, 12022046 github, level -5, old streaming, 205285 @@ -550,7 +550,7 @@ silesia, level 6, old stre silesia, level 7, old streaming advanced, 4596234 silesia, level 9, old streaming advanced, 4543862 silesia, level 13, old streaming advanced, 4482073 -silesia, level 16, old streaming advanced, 4377391 +silesia, level 16, old streaming advanced, 4377389 silesia, level 19, old streaming advanced, 4293262 silesia, no source size, old streaming advanced, 4862341 silesia, long distance mode, old streaming advanced, 12000408 @@ -576,8 +576,8 @@ silesia.tar, level 6, old stre silesia.tar, level 7, old streaming advanced, 4606658 silesia.tar, level 9, old streaming advanced, 4554105 silesia.tar, level 13, old streaming advanced, 4491703 -silesia.tar, level 16, old streaming advanced, 4381277 -silesia.tar, level 19, old streaming advanced, 4281514 +silesia.tar, level 16, old streaming advanced, 4381284 +silesia.tar, level 19, old streaming advanced, 4281512 silesia.tar, no source size, old streaming advanced, 4875006 silesia.tar, long distance mode, old streaming advanced, 12022046 silesia.tar, multithreaded, old streaming advanced, 12022046 @@ -587,7 +587,7 @@ silesia.tar, small hash log, old stre silesia.tar, small chain log, old streaming advanced, 12022046 silesia.tar, explicit params, old streaming advanced, 12022046 silesia.tar, uncompressed literals, old streaming advanced, 4875010 -silesia.tar, uncompressed literals optimal, old streaming advanced, 4281514 +silesia.tar, uncompressed literals optimal, old streaming advanced, 4281512 silesia.tar, huffman literals, old streaming advanced, 6190789 silesia.tar, multithreaded with advanced params, old streaming advanced, 12022046 github, level -5, old streaming advanced, 205285 @@ -642,7 +642,7 @@ silesia, level 6, old stre silesia, level 7, old streaming cdcit, 4596234 silesia, level 9, old streaming cdcit, 4543862 silesia, level 13, old streaming cdcit, 4482073 -silesia, level 16, old streaming cdcit, 4377391 +silesia, level 16, old streaming cdcit, 4377389 silesia, level 19, old streaming cdcit, 4293262 silesia, no source size, old streaming cdcit, 4862341 silesia, long distance mode, old streaming cdcit, 12000408 @@ -668,8 +668,8 @@ silesia.tar, level 6, old stre silesia.tar, level 7, old streaming cdcit, 4606658 silesia.tar, level 9, old streaming cdcit, 4554105 silesia.tar, level 13, old streaming cdcit, 4491703 -silesia.tar, level 16, old streaming cdcit, 4381277 -silesia.tar, level 19, old streaming cdcit, 4281514 +silesia.tar, level 16, old streaming cdcit, 4381284 +silesia.tar, level 19, old streaming cdcit, 4281512 silesia.tar, no source size, old streaming cdcit, 4875006 silesia.tar, long distance mode, old streaming cdcit, 12022046 silesia.tar, multithreaded, old streaming cdcit, 12022046 @@ -679,7 +679,7 @@ silesia.tar, small hash log, old stre silesia.tar, small chain log, old streaming cdcit, 12022046 silesia.tar, explicit params, old streaming cdcit, 12022046 silesia.tar, uncompressed literals, old streaming cdcit, 4875010 -silesia.tar, uncompressed literals optimal, old streaming cdcit, 4281514 +silesia.tar, uncompressed literals optimal, old streaming cdcit, 4281512 silesia.tar, huffman literals, old streaming cdcit, 6190789 silesia.tar, multithreaded with advanced params, old streaming cdcit, 12022046 github, level -5, old streaming cdcit, 205285 @@ -734,7 +734,7 @@ silesia, level 6, old stre silesia, level 7, old streaming advanced cdict, 4596234 silesia, level 9, old streaming advanced cdict, 4543862 silesia, level 13, old streaming advanced cdict, 4482073 -silesia, level 16, old streaming advanced cdict, 4377391 +silesia, level 16, old streaming advanced cdict, 4377389 silesia, level 19, old streaming advanced cdict, 4293262 silesia, no source size, old streaming advanced cdict, 4862341 silesia, long distance mode, old streaming advanced cdict, 12000408 @@ -760,8 +760,8 @@ silesia.tar, level 6, old stre silesia.tar, level 7, old streaming advanced cdict, 4606658 silesia.tar, level 9, old streaming advanced cdict, 4554105 silesia.tar, level 13, old streaming advanced cdict, 4491703 -silesia.tar, level 16, old streaming advanced cdict, 4381277 -silesia.tar, level 19, old streaming advanced cdict, 4281514 +silesia.tar, level 16, old streaming advanced cdict, 4381284 +silesia.tar, level 19, old streaming advanced cdict, 4281512 silesia.tar, no source size, old streaming advanced cdict, 4875006 silesia.tar, long distance mode, old streaming advanced cdict, 12022046 silesia.tar, multithreaded, old streaming advanced cdict, 12022046 @@ -771,7 +771,7 @@ silesia.tar, small hash log, old stre silesia.tar, small chain log, old streaming advanced cdict, 12022046 silesia.tar, explicit params, old streaming advanced cdict, 12022046 silesia.tar, uncompressed literals, old streaming advanced cdict, 4875010 -silesia.tar, uncompressed literals optimal, old streaming advanced cdict, 4281514 +silesia.tar, uncompressed literals optimal, old streaming advanced cdict, 4281512 silesia.tar, huffman literals, old streaming advanced cdict, 6190789 silesia.tar, multithreaded with advanced params, old streaming advanced cdict, 12022046 github, level -5, old streaming advanced cdict, 205285