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