xref: /freebsd/sys/contrib/zstd/programs/benchzstd.h (revision 5ff13fbc199bdf5f0572845351c68ee5ca828e71)
1a0483764SConrad Meyer /*
2*5ff13fbcSAllan Jude  * Copyright (c) Yann Collet, Facebook, Inc.
3a0483764SConrad Meyer  * All rights reserved.
4a0483764SConrad Meyer  *
5a0483764SConrad Meyer  * This source code is licensed under both the BSD-style license (found in the
6a0483764SConrad Meyer  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7a0483764SConrad Meyer  * in the COPYING file in the root directory of this source tree).
8a0483764SConrad Meyer  * You may select, at your option, one of the above-listed licenses.
9a0483764SConrad Meyer  */
10a0483764SConrad Meyer 
11a0483764SConrad Meyer  /* benchzstd :
12a0483764SConrad Meyer   * benchmark Zstandard compression / decompression
13a0483764SConrad Meyer   * over a set of files or buffers
14a0483764SConrad Meyer   * and display progress result and final summary
15a0483764SConrad Meyer   */
16a0483764SConrad Meyer 
17a0483764SConrad Meyer #if defined (__cplusplus)
18a0483764SConrad Meyer extern "C" {
19a0483764SConrad Meyer #endif
20a0483764SConrad Meyer 
21a0483764SConrad Meyer #ifndef BENCH_ZSTD_H_3242387
22a0483764SConrad Meyer #define BENCH_ZSTD_H_3242387
23a0483764SConrad Meyer 
24a0483764SConrad Meyer /* ===  Dependencies  === */
25a0483764SConrad Meyer #include <stddef.h>   /* size_t */
26a0483764SConrad Meyer #define ZSTD_STATIC_LINKING_ONLY   /* ZSTD_compressionParameters */
2737f1f268SConrad Meyer #include "../lib/zstd.h"     /* ZSTD_compressionParameters */
28a0483764SConrad Meyer 
29a0483764SConrad Meyer 
30a0483764SConrad Meyer /* ===  Constants  === */
31a0483764SConrad Meyer 
32a0483764SConrad Meyer #define MB_UNIT 1000000
33a0483764SConrad Meyer 
34a0483764SConrad Meyer 
35a0483764SConrad Meyer /* ===  Benchmark functions  === */
36a0483764SConrad Meyer 
37a0483764SConrad Meyer /* Creates a variant `typeName`, able to express "error or valid result".
38a0483764SConrad Meyer  * Functions with return type `typeName`
39a0483764SConrad Meyer  * must first check if result is valid, using BMK_isSuccessful_*(),
40a0483764SConrad Meyer  * and only then can extract `baseType`.
41a0483764SConrad Meyer  */
42a0483764SConrad Meyer #define VARIANT_ERROR_RESULT(baseType, variantName)  \
43a0483764SConrad Meyer                                              \
44a0483764SConrad Meyer typedef struct {                             \
45a0483764SConrad Meyer     baseType internal_never_use_directly;    \
46a0483764SConrad Meyer     int tag;                                 \
47a0483764SConrad Meyer } variantName
48a0483764SConrad Meyer 
49a0483764SConrad Meyer 
50a0483764SConrad Meyer typedef struct {
51a0483764SConrad Meyer     size_t cSize;
52a0483764SConrad Meyer     unsigned long long cSpeed;   /* bytes / sec */
53a0483764SConrad Meyer     unsigned long long dSpeed;
54a0483764SConrad Meyer     size_t cMem;                 /* memory usage during compression */
55a0483764SConrad Meyer } BMK_benchResult_t;
56a0483764SConrad Meyer 
57a0483764SConrad Meyer VARIANT_ERROR_RESULT(BMK_benchResult_t, BMK_benchOutcome_t);
58a0483764SConrad Meyer 
59a0483764SConrad Meyer /* check first if the return structure represents an error or a valid result */
60a0483764SConrad Meyer int BMK_isSuccessful_benchOutcome(BMK_benchOutcome_t outcome);
61a0483764SConrad Meyer 
62a0483764SConrad Meyer /* extract result from variant type.
63a0483764SConrad Meyer  * note : this function will abort() program execution if result is not valid
64a0483764SConrad Meyer  *        check result validity first, by using BMK_isSuccessful_benchOutcome()
65a0483764SConrad Meyer  */
66a0483764SConrad Meyer BMK_benchResult_t BMK_extract_benchResult(BMK_benchOutcome_t outcome);
67a0483764SConrad Meyer 
68a0483764SConrad Meyer 
69a0483764SConrad Meyer /*! BMK_benchFiles() -- called by zstdcli */
70a0483764SConrad Meyer /*  Loads files from fileNamesTable into memory,
71a0483764SConrad Meyer  *  and an optional dictionary from dictFileName (can be NULL),
72a0483764SConrad Meyer  *  then uses benchMem().
73a0483764SConrad Meyer  *  fileNamesTable - name of files to benchmark.
74a0483764SConrad Meyer  *  nbFiles - number of files (size of fileNamesTable), must be > 0.
75a0483764SConrad Meyer  *  dictFileName - name of dictionary file to load.
76a0483764SConrad Meyer  *  cLevel - compression level to benchmark, errors if invalid.
77a0483764SConrad Meyer  *  compressionParams - advanced compression Parameters.
78a0483764SConrad Meyer  *  displayLevel - what gets printed:
79a0483764SConrad Meyer  *      0 : no display;
80a0483764SConrad Meyer  *      1 : errors;
81a0483764SConrad Meyer  *      2 : + result + interaction + warnings;
82a0483764SConrad Meyer  *      3 : + information;
83a0483764SConrad Meyer  *      4 : + debug
84a0483764SConrad Meyer  * @return:
85a0483764SConrad Meyer  *      a variant, which expresses either an error, or a valid result.
86a0483764SConrad Meyer  *      Use BMK_isSuccessful_benchOutcome() to check if function was successful.
87a0483764SConrad Meyer  *      If yes, extract the valid result with BMK_extract_benchResult(),
88a0483764SConrad Meyer  *      it will contain :
89a0483764SConrad Meyer  *          .cSpeed: compression speed in bytes per second,
90a0483764SConrad Meyer  *          .dSpeed: decompression speed in bytes per second,
91a0483764SConrad Meyer  *          .cSize : compressed size, in bytes
92a0483764SConrad Meyer  *          .cMem  : memory budget required for the compression context
93a0483764SConrad Meyer  */
94a0483764SConrad Meyer BMK_benchOutcome_t BMK_benchFiles(
95a0483764SConrad Meyer                    const char* const * fileNamesTable, unsigned nbFiles,
96a0483764SConrad Meyer                    const char* dictFileName,
97a0483764SConrad Meyer                    int cLevel, const ZSTD_compressionParameters* compressionParams,
98a0483764SConrad Meyer                    int displayLevel);
99a0483764SConrad Meyer 
100a0483764SConrad Meyer 
101a0483764SConrad Meyer typedef enum {
102a0483764SConrad Meyer     BMK_both = 0,
103a0483764SConrad Meyer     BMK_decodeOnly = 1,
104a0483764SConrad Meyer     BMK_compressOnly = 2
105a0483764SConrad Meyer } BMK_mode_t;
106a0483764SConrad Meyer 
107a0483764SConrad Meyer typedef struct {
108a0483764SConrad Meyer     BMK_mode_t mode;        /* 0: all, 1: compress only 2: decode only */
109a0483764SConrad Meyer     unsigned nbSeconds;     /* default timing is in nbSeconds */
110a0483764SConrad Meyer     size_t blockSize;       /* Maximum size of each block*/
1112b9c00cbSConrad Meyer     int nbWorkers;          /* multithreading */
112a0483764SConrad Meyer     unsigned realTime;      /* real time priority */
113a0483764SConrad Meyer     int additionalParam;    /* used by python speed benchmark */
1142b9c00cbSConrad Meyer     int ldmFlag;            /* enables long distance matching */
1152b9c00cbSConrad Meyer     int ldmMinMatch;        /* below: parameters for long distance matching, see zstd.1.md */
1162b9c00cbSConrad Meyer     int ldmHashLog;
1172b9c00cbSConrad Meyer     int ldmBucketSizeLog;
1182b9c00cbSConrad Meyer     int ldmHashRateLog;
119*5ff13fbcSAllan Jude     ZSTD_paramSwitch_e literalCompressionMode;
120*5ff13fbcSAllan Jude     int useRowMatchFinder;  /* use row-based matchfinder if possible */
121a0483764SConrad Meyer } BMK_advancedParams_t;
122a0483764SConrad Meyer 
123a0483764SConrad Meyer /* returns default parameters used by nonAdvanced functions */
124a0483764SConrad Meyer BMK_advancedParams_t BMK_initAdvancedParams(void);
125a0483764SConrad Meyer 
126a0483764SConrad Meyer /*! BMK_benchFilesAdvanced():
127a0483764SConrad Meyer  *  Same as BMK_benchFiles(),
128a0483764SConrad Meyer  *  with more controls, provided through advancedParams_t structure */
129a0483764SConrad Meyer BMK_benchOutcome_t BMK_benchFilesAdvanced(
130a0483764SConrad Meyer                    const char* const * fileNamesTable, unsigned nbFiles,
131a0483764SConrad Meyer                    const char* dictFileName,
132a0483764SConrad Meyer                    int cLevel, const ZSTD_compressionParameters* compressionParams,
133a0483764SConrad Meyer                    int displayLevel, const BMK_advancedParams_t* adv);
134a0483764SConrad Meyer 
135a0483764SConrad Meyer /*! BMK_syntheticTest() -- called from zstdcli */
136a0483764SConrad Meyer /*  Generates a sample with datagen, using compressibility argument */
137a0483764SConrad Meyer /*  cLevel - compression level to benchmark, errors if invalid
138a0483764SConrad Meyer  *  compressibility - determines compressibility of sample
139a0483764SConrad Meyer  *  compressionParams - basic compression Parameters
140a0483764SConrad Meyer  *  displayLevel - see benchFiles
141a0483764SConrad Meyer  *  adv - see advanced_Params_t
142a0483764SConrad Meyer  * @return:
143a0483764SConrad Meyer  *      a variant, which expresses either an error, or a valid result.
144a0483764SConrad Meyer  *      Use BMK_isSuccessful_benchOutcome() to check if function was successful.
145a0483764SConrad Meyer  *      If yes, extract the valid result with BMK_extract_benchResult(),
146a0483764SConrad Meyer  *      it will contain :
147a0483764SConrad Meyer  *          .cSpeed: compression speed in bytes per second,
148a0483764SConrad Meyer  *          .dSpeed: decompression speed in bytes per second,
149a0483764SConrad Meyer  *          .cSize : compressed size, in bytes
150a0483764SConrad Meyer  *          .cMem  : memory budget required for the compression context
151a0483764SConrad Meyer  */
152a0483764SConrad Meyer BMK_benchOutcome_t BMK_syntheticTest(
153a0483764SConrad Meyer                           int cLevel, double compressibility,
154a0483764SConrad Meyer                           const ZSTD_compressionParameters* compressionParams,
155a0483764SConrad Meyer                           int displayLevel, const BMK_advancedParams_t* adv);
156a0483764SConrad Meyer 
157a0483764SConrad Meyer 
158a0483764SConrad Meyer 
159a0483764SConrad Meyer /* ===  Benchmark Zstandard in a memory-to-memory scenario  === */
160a0483764SConrad Meyer 
161a0483764SConrad Meyer /** BMK_benchMem() -- core benchmarking function, called in paramgrill
162a0483764SConrad Meyer  *  applies ZSTD_compress_generic() and ZSTD_decompress_generic() on data in srcBuffer
163a0483764SConrad Meyer  *  with specific compression parameters provided by other arguments using benchFunction
164a0483764SConrad Meyer  *  (cLevel, comprParams + adv in advanced Mode) */
165a0483764SConrad Meyer /*  srcBuffer - data source, expected to be valid compressed data if in Decode Only Mode
166a0483764SConrad Meyer  *  srcSize - size of data in srcBuffer
167a0483764SConrad Meyer  *  fileSizes - srcBuffer is considered cut into 1+ segments, to compress separately.
168a0483764SConrad Meyer  *              note : sum(fileSizes) must be == srcSize.  (<== ensure it's properly checked)
169a0483764SConrad Meyer  *  nbFiles - nb of segments
170a0483764SConrad Meyer  *  cLevel - compression level
171a0483764SConrad Meyer  *  comprParams - basic compression parameters
172a0483764SConrad Meyer  *  dictBuffer - a dictionary if used, null otherwise
173a0483764SConrad Meyer  *  dictBufferSize - size of dictBuffer, 0 otherwise
1742b9c00cbSConrad Meyer  *  displayLevel - see BMK_benchFiles
175a0483764SConrad Meyer  *  displayName - name used by display
176a0483764SConrad Meyer  * @return:
177a0483764SConrad Meyer  *      a variant, which expresses either an error, or a valid result.
178a0483764SConrad Meyer  *      Use BMK_isSuccessful_benchOutcome() to check if function was successful.
179a0483764SConrad Meyer  *      If yes, extract the valid result with BMK_extract_benchResult(),
180a0483764SConrad Meyer  *      it will contain :
181a0483764SConrad Meyer  *          .cSpeed: compression speed in bytes per second,
182a0483764SConrad Meyer  *          .dSpeed: decompression speed in bytes per second,
183a0483764SConrad Meyer  *          .cSize : compressed size, in bytes
184a0483764SConrad Meyer  *          .cMem  : memory budget required for the compression context
185a0483764SConrad Meyer  */
186a0483764SConrad Meyer BMK_benchOutcome_t BMK_benchMem(const void* srcBuffer, size_t srcSize,
187a0483764SConrad Meyer                         const size_t* fileSizes, unsigned nbFiles,
188a0483764SConrad Meyer                         int cLevel, const ZSTD_compressionParameters* comprParams,
189a0483764SConrad Meyer                         const void* dictBuffer, size_t dictBufferSize,
190a0483764SConrad Meyer                         int displayLevel, const char* displayName);
191a0483764SConrad Meyer 
192a0483764SConrad Meyer 
193a0483764SConrad Meyer /* BMK_benchMemAdvanced() : same as BMK_benchMem()
194a0483764SConrad Meyer  * with following additional options :
195a0483764SConrad Meyer  * dstBuffer - destination buffer to write compressed output in, NULL if none provided.
196a0483764SConrad Meyer  * dstCapacity - capacity of destination buffer, give 0 if dstBuffer = NULL
197a0483764SConrad Meyer  * adv = see advancedParams_t
198a0483764SConrad Meyer  */
199a0483764SConrad Meyer BMK_benchOutcome_t BMK_benchMemAdvanced(const void* srcBuffer, size_t srcSize,
200a0483764SConrad Meyer                         void* dstBuffer, size_t dstCapacity,
201a0483764SConrad Meyer                         const size_t* fileSizes, unsigned nbFiles,
202a0483764SConrad Meyer                         int cLevel, const ZSTD_compressionParameters* comprParams,
203a0483764SConrad Meyer                         const void* dictBuffer, size_t dictBufferSize,
204a0483764SConrad Meyer                         int displayLevel, const char* displayName,
205a0483764SConrad Meyer                         const BMK_advancedParams_t* adv);
206a0483764SConrad Meyer 
207a0483764SConrad Meyer 
208a0483764SConrad Meyer 
209a0483764SConrad Meyer #endif   /* BENCH_ZSTD_H_3242387 */
210a0483764SConrad Meyer 
211a0483764SConrad Meyer #if defined (__cplusplus)
212a0483764SConrad Meyer }
213a0483764SConrad Meyer #endif
214