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