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