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