Path: blob/main/sys/contrib/zstd/programs/benchzstd.h
48254 views
/*1* Copyright (c) Yann Collet, Facebook, Inc.2* All rights reserved.3*4* This source code is licensed under both the BSD-style license (found in the5* LICENSE file in the root directory of this source tree) and the GPLv2 (found6* in the COPYING file in the root directory of this source tree).7* You may select, at your option, one of the above-listed licenses.8*/910/* benchzstd :11* benchmark Zstandard compression / decompression12* over a set of files or buffers13* and display progress result and final summary14*/1516#if defined (__cplusplus)17extern "C" {18#endif1920#ifndef BENCH_ZSTD_H_324238721#define BENCH_ZSTD_H_32423872223/* === Dependencies === */24#include <stddef.h> /* size_t */25#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressionParameters */26#include "../lib/zstd.h" /* ZSTD_compressionParameters */272829/* === Constants === */3031#define MB_UNIT 1000000323334/* === Benchmark functions === */3536/* Creates a variant `typeName`, able to express "error or valid result".37* Functions with return type `typeName`38* must first check if result is valid, using BMK_isSuccessful_*(),39* and only then can extract `baseType`.40*/41#define VARIANT_ERROR_RESULT(baseType, variantName) \42\43typedef struct { \44baseType internal_never_use_directly; \45int tag; \46} variantName474849typedef struct {50size_t cSize;51unsigned long long cSpeed; /* bytes / sec */52unsigned long long dSpeed;53size_t cMem; /* memory usage during compression */54} BMK_benchResult_t;5556VARIANT_ERROR_RESULT(BMK_benchResult_t, BMK_benchOutcome_t);5758/* check first if the return structure represents an error or a valid result */59int BMK_isSuccessful_benchOutcome(BMK_benchOutcome_t outcome);6061/* extract result from variant type.62* note : this function will abort() program execution if result is not valid63* check result validity first, by using BMK_isSuccessful_benchOutcome()64*/65BMK_benchResult_t BMK_extract_benchResult(BMK_benchOutcome_t outcome);666768/*! BMK_benchFiles() -- called by zstdcli */69/* Loads files from fileNamesTable into memory,70* and an optional dictionary from dictFileName (can be NULL),71* then uses benchMem().72* fileNamesTable - name of files to benchmark.73* nbFiles - number of files (size of fileNamesTable), must be > 0.74* dictFileName - name of dictionary file to load.75* cLevel - compression level to benchmark, errors if invalid.76* compressionParams - advanced compression Parameters.77* displayLevel - what gets printed:78* 0 : no display;79* 1 : errors;80* 2 : + result + interaction + warnings;81* 3 : + information;82* 4 : + debug83* @return:84* a variant, which expresses either an error, or a valid result.85* Use BMK_isSuccessful_benchOutcome() to check if function was successful.86* If yes, extract the valid result with BMK_extract_benchResult(),87* it will contain :88* .cSpeed: compression speed in bytes per second,89* .dSpeed: decompression speed in bytes per second,90* .cSize : compressed size, in bytes91* .cMem : memory budget required for the compression context92*/93BMK_benchOutcome_t BMK_benchFiles(94const char* const * fileNamesTable, unsigned nbFiles,95const char* dictFileName,96int cLevel, const ZSTD_compressionParameters* compressionParams,97int displayLevel);9899100typedef enum {101BMK_both = 0,102BMK_decodeOnly = 1,103BMK_compressOnly = 2104} BMK_mode_t;105106typedef struct {107BMK_mode_t mode; /* 0: all, 1: compress only 2: decode only */108unsigned nbSeconds; /* default timing is in nbSeconds */109size_t blockSize; /* Maximum size of each block*/110int nbWorkers; /* multithreading */111unsigned realTime; /* real time priority */112int additionalParam; /* used by python speed benchmark */113int ldmFlag; /* enables long distance matching */114int ldmMinMatch; /* below: parameters for long distance matching, see zstd.1.md */115int ldmHashLog;116int ldmBucketSizeLog;117int ldmHashRateLog;118ZSTD_paramSwitch_e literalCompressionMode;119int useRowMatchFinder; /* use row-based matchfinder if possible */120} BMK_advancedParams_t;121122/* returns default parameters used by nonAdvanced functions */123BMK_advancedParams_t BMK_initAdvancedParams(void);124125/*! BMK_benchFilesAdvanced():126* Same as BMK_benchFiles(),127* with more controls, provided through advancedParams_t structure */128BMK_benchOutcome_t BMK_benchFilesAdvanced(129const char* const * fileNamesTable, unsigned nbFiles,130const char* dictFileName,131int cLevel, const ZSTD_compressionParameters* compressionParams,132int displayLevel, const BMK_advancedParams_t* adv);133134/*! BMK_syntheticTest() -- called from zstdcli */135/* Generates a sample with datagen, using compressibility argument */136/* cLevel - compression level to benchmark, errors if invalid137* compressibility - determines compressibility of sample138* compressionParams - basic compression Parameters139* displayLevel - see benchFiles140* adv - see advanced_Params_t141* @return:142* a variant, which expresses either an error, or a valid result.143* Use BMK_isSuccessful_benchOutcome() to check if function was successful.144* If yes, extract the valid result with BMK_extract_benchResult(),145* it will contain :146* .cSpeed: compression speed in bytes per second,147* .dSpeed: decompression speed in bytes per second,148* .cSize : compressed size, in bytes149* .cMem : memory budget required for the compression context150*/151BMK_benchOutcome_t BMK_syntheticTest(152int cLevel, double compressibility,153const ZSTD_compressionParameters* compressionParams,154int displayLevel, const BMK_advancedParams_t* adv);155156157158/* === Benchmark Zstandard in a memory-to-memory scenario === */159160/** BMK_benchMem() -- core benchmarking function, called in paramgrill161* applies ZSTD_compress_generic() and ZSTD_decompress_generic() on data in srcBuffer162* with specific compression parameters provided by other arguments using benchFunction163* (cLevel, comprParams + adv in advanced Mode) */164/* srcBuffer - data source, expected to be valid compressed data if in Decode Only Mode165* srcSize - size of data in srcBuffer166* fileSizes - srcBuffer is considered cut into 1+ segments, to compress separately.167* note : sum(fileSizes) must be == srcSize. (<== ensure it's properly checked)168* nbFiles - nb of segments169* cLevel - compression level170* comprParams - basic compression parameters171* dictBuffer - a dictionary if used, null otherwise172* dictBufferSize - size of dictBuffer, 0 otherwise173* displayLevel - see BMK_benchFiles174* displayName - name used by display175* @return:176* a variant, which expresses either an error, or a valid result.177* Use BMK_isSuccessful_benchOutcome() to check if function was successful.178* If yes, extract the valid result with BMK_extract_benchResult(),179* it will contain :180* .cSpeed: compression speed in bytes per second,181* .dSpeed: decompression speed in bytes per second,182* .cSize : compressed size, in bytes183* .cMem : memory budget required for the compression context184*/185BMK_benchOutcome_t BMK_benchMem(const void* srcBuffer, size_t srcSize,186const size_t* fileSizes, unsigned nbFiles,187int cLevel, const ZSTD_compressionParameters* comprParams,188const void* dictBuffer, size_t dictBufferSize,189int displayLevel, const char* displayName);190191192/* BMK_benchMemAdvanced() : same as BMK_benchMem()193* with following additional options :194* dstBuffer - destination buffer to write compressed output in, NULL if none provided.195* dstCapacity - capacity of destination buffer, give 0 if dstBuffer = NULL196* adv = see advancedParams_t197*/198BMK_benchOutcome_t BMK_benchMemAdvanced(const void* srcBuffer, size_t srcSize,199void* dstBuffer, size_t dstCapacity,200const size_t* fileSizes, unsigned nbFiles,201int cLevel, const ZSTD_compressionParameters* comprParams,202const void* dictBuffer, size_t dictBufferSize,203int displayLevel, const char* displayName,204const BMK_advancedParams_t* adv);205206207208#endif /* BENCH_ZSTD_H_3242387 */209210#if defined (__cplusplus)211}212#endif213214215