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