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