From: Yann Collet Date: Wed, 18 Dec 2024 01:25:57 +0000 (-0800) Subject: added benchmark for ZSTD_convertBlockSequences_wBlockDelim() X-Git-Tag: v1.5.7^2~48^2~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=95ad9e47ffa930d2facb5d2dd2de511bf8171e5d;p=thirdparty%2Fzstd.git added benchmark for ZSTD_convertBlockSequences_wBlockDelim() --- diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 3c5cb209c..c4f699eb0 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -3240,12 +3240,6 @@ static size_t ZSTD_fastSequenceLengthSum(ZSTD_Sequence const* seqBuf, size_t seq return litLenSum + matchLenSum; } -typedef struct { - U32 idx; /* Index in array of ZSTD_Sequence */ - U32 posInSequence; /* Position within sequence at idx */ - size_t posInSrc; /* Number of bytes given by sequences provided so far */ -} ZSTD_SequencePosition; - static size_t ZSTD_transferSequences_wBlockDelim(ZSTD_CCtx* cctx, ZSTD_SequencePosition* seqPos, @@ -7103,7 +7097,7 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* cctx, * @blockSize must be exactly correct. */ FORCE_INLINE_TEMPLATE size_t -ZSTD_convertSequences_wBlockDelim_internal(ZSTD_CCtx* cctx, +ZSTD_convertBlockSequences_wBlockDelim_internal(ZSTD_CCtx* cctx, ZSTD_SequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t nbSequences, size_t blockSize, @@ -7200,32 +7194,39 @@ ZSTD_convertSequences_wBlockDelim_internal(ZSTD_CCtx* cctx, return litConsumed; } -typedef size_t (*ZSTD_transferSequencesOnly_f) (ZSTD_CCtx* cctx, +/* for tests only */ +void CCTX_resetSeqStore(ZSTD_CCtx* cctx) +{ + cctx->seqStore.sequences = cctx->seqStore.sequencesStart; + cctx->seqStore.lit = cctx->seqStore.litStart; +} + +typedef size_t (*ZSTD_convertBlockSequences_f) (ZSTD_CCtx* cctx, ZSTD_SequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t nbSequences, size_t blockSize, int const repcodeResolution); -static size_t -ZSTD_convertSequences_wBlockDelim(ZSTD_CCtx* cctx, +size_t +ZSTD_convertBlockSequences_wBlockDelim(ZSTD_CCtx* cctx, ZSTD_SequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t nbSequences, size_t blockSize, int const repcodeResolution) { - return ZSTD_convertSequences_wBlockDelim_internal(cctx, + return ZSTD_convertBlockSequences_wBlockDelim_internal(cctx, seqPos, inSeqs, nbSequences, blockSize, repcodeResolution, 0); } static size_t -ZSTD_convertSequences_wBlockDelim_andCheckSequences(ZSTD_CCtx* cctx, +ZSTD_convertBlockSequences_wBlockDelim_andCheckSequences(ZSTD_CCtx* cctx, ZSTD_SequencePosition* seqPos, const ZSTD_Sequence* const inSeqs, size_t nbSequences, size_t blockSize, int const repcodeResolution) { - return ZSTD_convertSequences_wBlockDelim_internal(cctx, + return ZSTD_convertBlockSequences_wBlockDelim_internal(cctx, seqPos, inSeqs, nbSequences, blockSize, repcodeResolution, 1); } @@ -7241,9 +7242,9 @@ ZSTD_compressSequencesAndLiterals_internal(ZSTD_CCtx* cctx, ZSTD_SequencePosition seqPos = {0, 0, 0}; BYTE* op = (BYTE*)dst; int const repcodeResolution = (cctx->appliedParams.searchForExternalRepcodes == ZSTD_ps_enable); - const ZSTD_transferSequencesOnly_f transfer = cctx->appliedParams.validateSequences ? - ZSTD_convertSequences_wBlockDelim_andCheckSequences - : ZSTD_convertSequences_wBlockDelim; + const ZSTD_convertBlockSequences_f convertBlockSequences = cctx->appliedParams.validateSequences ? + ZSTD_convertBlockSequences_wBlockDelim_andCheckSequences + : ZSTD_convertBlockSequences_wBlockDelim; DEBUGLOG(4, "ZSTD_compressSequencesAndLiterals_internal: nbSeqs=%zu, litSize=%zu", nbSequences, litSize); if (cctx->appliedParams.blockDelimiters == ZSTD_sf_noBlockDelimiters) { @@ -7271,7 +7272,7 @@ ZSTD_compressSequencesAndLiterals_internal(ZSTD_CCtx* cctx, assert(blockSize <= remaining); ZSTD_resetSeqStore(&cctx->seqStore); - litConsumed = transfer(cctx, + litConsumed = convertBlockSequences(cctx, &seqPos, inSeqs, nbSequences, blockSize, diff --git a/lib/compress/zstd_compress_internal.h b/lib/compress/zstd_compress_internal.h index 10bd8ca70..bbcf4a7d5 100644 --- a/lib/compress/zstd_compress_internal.h +++ b/lib/compress/zstd_compress_internal.h @@ -1522,6 +1522,22 @@ size_t ZSTD_loadCEntropy(ZSTD_compressedBlockState_t* bs, void* workspace, void ZSTD_reset_compressedBlockState(ZSTD_compressedBlockState_t* bs); +typedef struct { + U32 idx; /* Index in array of ZSTD_Sequence */ + U32 posInSequence; /* Position within sequence at idx */ + size_t posInSrc; /* Number of bytes given by sequences provided so far */ +} ZSTD_SequencePosition; + +size_t +ZSTD_convertBlockSequences_wBlockDelim(ZSTD_CCtx* cctx, + ZSTD_SequencePosition* seqPos, + const ZSTD_Sequence* const inSeqs, size_t nbSequences, + size_t blockSize, + int const repcodeResolution); + +/* for tests only */ +void CCTX_resetSeqStore(ZSTD_CCtx* cctx); + /* ============================================================== * Private declarations * These prototypes shall only be called from within lib/compress diff --git a/tests/fullbench.c b/tests/fullbench.c index e89a2b326..c42c923c1 100644 --- a/tests/fullbench.c +++ b/tests/fullbench.c @@ -21,6 +21,7 @@ #include #include "mem.h" /* U32 */ +#include "compress/zstd_compress_internal.h" #ifndef ZSTD_DLL_IMPORT #include "zstd_internal.h" /* ZSTD_decodeSeqHeaders, ZSTD_blockHeaderSize, ZSTD_getcBlockSize, blockType_e, KB, MB */ #include "decompress/zstd_decompress_internal.h" /* ZSTD_DCtx struct */ @@ -627,6 +628,64 @@ local_compressSequencesAndLiterals(const void* input, size_t inputSize, return ZSTD_compressSequencesAndLiterals(g_zcc, dst, dstCapacity, seqs, nbSeqs, literals, nbLiterals, srcSize); } +static PrepResult prepConvertSequences(const void* src, size_t srcSize, int cLevel) +{ + PrepResult r = PREPRESULT_INIT; + size_t const prepCapacity = srcSize * 4; + void* prepBuffer = malloc(prepCapacity); + void* sequencesStart = (char*)prepBuffer + 2*sizeof(unsigned); + ZSTD_Sequence* const seqs = sequencesStart; + size_t const seqsCapacity = prepCapacity / sizeof(ZSTD_Sequence); + size_t totalNbSeqs, nbSeqs, blockSize=0; + ZSTD_CCtx_reset(g_zcc, ZSTD_reset_session_and_parameters); + ZSTD_CCtx_setParameter(g_zcc, ZSTD_c_compressionLevel, cLevel); + totalNbSeqs = ZSTD_generateSequences(g_zcc, seqs, seqsCapacity, src, srcSize); + CONTROL(!ZSTD_isError(totalNbSeqs)); + /* find nb sequences in first block */ + { size_t n; + for (n=0; n