1b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet./* 2b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. bench.c - Demo program to benchmark open-source compression algorithm 356609a3adb3ec509edf2a37c4923f736f8a6e756Yann Collet Copyright (C) Yann Collet 2012-2014 4b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. GPL v2 License 5b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 6b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. This program is free software; you can redistribute it and/or modify 7b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. it under the terms of the GNU General Public License as published by 8b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. the Free Software Foundation; either version 2 of the License, or 9b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. (at your option) any later version. 10b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 11b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. This program is distributed in the hope that it will be useful, 12b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. but WITHOUT ANY WARRANTY; without even the implied warranty of 13b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. GNU General Public License for more details. 15b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 16b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. You should have received a copy of the GNU General Public License along 17b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. with this program; if not, write to the Free Software Foundation, Inc., 18b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 20b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. You can contact the author at : 21b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. - LZ4 homepage : http://fastcompression.blogspot.com/p/lz4.html 22b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. - LZ4 source repository : http://code.google.com/p/lz4/ 23b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.*/ 24b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 251e7c898533406da8a170dc0e951989bdc448c024Yann Collet/************************************** 261e7c898533406da8a170dc0e951989bdc448c024Yann Collet* Compiler Options 271e7c898533406da8a170dc0e951989bdc448c024Yann Collet***************************************/ 281e7c898533406da8a170dc0e951989bdc448c024Yann Collet/* Disable some Visual warning messages */ 29b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#define _CRT_SECURE_NO_WARNINGS 301e7c898533406da8a170dc0e951989bdc448c024Yann Collet#define _CRT_SECURE_NO_DEPRECATE /* VS2005 */ 31b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 321e7c898533406da8a170dc0e951989bdc448c024Yann Collet/* Unix Large Files support (>4GB) */ 33b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#define _FILE_OFFSET_BITS 64 341e7c898533406da8a170dc0e951989bdc448c024Yann Collet#if (defined(__sun__) && (!defined(__LP64__))) /* Sun Solaris 32-bits requires specific definitions */ 35f9c0666803ef64a2e591a7baeb26dd941bb6c9b8Yann Collet# define _LARGEFILE_SOURCE 361e7c898533406da8a170dc0e951989bdc448c024Yann Collet#elif ! defined(__LP64__) /* No point defining Large file for 64 bit */ 37b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.# define _LARGEFILE64_SOURCE 38b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#endif 39b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 401e7c898533406da8a170dc0e951989bdc448c024Yann Collet/* S_ISREG & gettimeofday() are not supported by MSVC */ 41b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#if defined(_MSC_VER) || defined(_WIN32) 42b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.# define BMK_LEGACY_TIMER 1 43b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#endif 44b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 45b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 461e7c898533406da8a170dc0e951989bdc448c024Yann Collet/************************************** 471e7c898533406da8a170dc0e951989bdc448c024Yann Collet* Includes 481e7c898533406da8a170dc0e951989bdc448c024Yann Collet***************************************/ 491e7c898533406da8a170dc0e951989bdc448c024Yann Collet#include <stdlib.h> /* malloc */ 501e7c898533406da8a170dc0e951989bdc448c024Yann Collet#include <stdio.h> /* fprintf, fopen, ftello64 */ 511e7c898533406da8a170dc0e951989bdc448c024Yann Collet#include <sys/types.h> /* stat64 */ 521e7c898533406da8a170dc0e951989bdc448c024Yann Collet#include <sys/stat.h> /* stat64 */ 53b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 541e7c898533406da8a170dc0e951989bdc448c024Yann Collet/* Use ftime() if gettimeofday() is not available on your target */ 55b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#if defined(BMK_LEGACY_TIMER) 561e7c898533406da8a170dc0e951989bdc448c024Yann Collet# include <sys/timeb.h> /* timeb, ftime */ 57b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#else 581e7c898533406da8a170dc0e951989bdc448c024Yann Collet# include <sys/time.h> /* gettimeofday */ 59b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#endif 60b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 61b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#include "lz4.h" 626875c27f71d5eb85b54e742f75df5e7232c035dfyann.collet.#define COMPRESSOR0 LZ4_compress_local 636875c27f71d5eb85b54e742f75df5e7232c035dfyann.collet.static int LZ4_compress_local(const char* src, char* dst, int size, int clevel) { (void)clevel; return LZ4_compress(src, dst, size); } 64b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#include "lz4hc.h" 656875c27f71d5eb85b54e742f75df5e7232c035dfyann.collet.#define COMPRESSOR1 LZ4_compressHC2 66b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#define DEFAULTCOMPRESSOR COMPRESSOR0 67b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 68b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#include "xxhash.h" 69b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 70b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 711e7c898533406da8a170dc0e951989bdc448c024Yann Collet/************************************** 721e7c898533406da8a170dc0e951989bdc448c024Yann Collet* Compiler specifics 731e7c898533406da8a170dc0e951989bdc448c024Yann Collet***************************************/ 74b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#if !defined(S_ISREG) 75b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.# define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) 76b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#endif 77b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 78b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 791e7c898533406da8a170dc0e951989bdc448c024Yann Collet/************************************** 801e7c898533406da8a170dc0e951989bdc448c024Yann Collet* Basic Types 811e7c898533406da8a170dc0e951989bdc448c024Yann Collet***************************************/ 82bc1388ec7879a3ed2cd9dfac6c10cc6129f96f3eYann Collet#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */ 83b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.# include <stdint.h> 84b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. typedef uint8_t BYTE; 85b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. typedef uint16_t U16; 86b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. typedef uint32_t U32; 87b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. typedef int32_t S32; 88b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. typedef uint64_t U64; 89b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#else 90b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. typedef unsigned char BYTE; 91b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. typedef unsigned short U16; 92b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. typedef unsigned int U32; 93b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. typedef signed int S32; 94b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. typedef unsigned long long U64; 95b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#endif 96b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 97b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 981e7c898533406da8a170dc0e951989bdc448c024Yann Collet/************************************** 991e7c898533406da8a170dc0e951989bdc448c024Yann Collet* Constants 1001e7c898533406da8a170dc0e951989bdc448c024Yann Collet***************************************/ 101b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#define NBLOOPS 3 102b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#define TIMELOOP 2000 103b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 1041e7c898533406da8a170dc0e951989bdc448c024Yann Collet#define KB *(1 <<10) 1051e7c898533406da8a170dc0e951989bdc448c024Yann Collet#define MB *(1 <<20) 106b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#define GB *(1U<<30) 107b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 108b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#define MAX_MEM (2 GB - 64 MB) 109b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#define DEFAULT_CHUNKSIZE (4 MB) 110b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 111b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 1121e7c898533406da8a170dc0e951989bdc448c024Yann Collet/************************************** 1131e7c898533406da8a170dc0e951989bdc448c024Yann Collet* Local structures 1141e7c898533406da8a170dc0e951989bdc448c024Yann Collet***************************************/ 115b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.struct chunkParameters 116b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.{ 117b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. U32 id; 118b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. char* origBuffer; 119b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. char* compressedBuffer; 120b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int origSize; 121b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int compressedSize; 122b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.}; 123b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 124b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.struct compressionParameters 125b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.{ 1266875c27f71d5eb85b54e742f75df5e7232c035dfyann.collet. int (*compressionFunction)(const char*, char*, int, int); 127b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int (*decompressionFunction)(const char*, char*, int); 128b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.}; 129b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 130b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 1311e7c898533406da8a170dc0e951989bdc448c024Yann Collet/************************************** 1321e7c898533406da8a170dc0e951989bdc448c024Yann Collet* MACRO 1331e7c898533406da8a170dc0e951989bdc448c024Yann Collet***************************************/ 134b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#define DISPLAY(...) fprintf(stderr, __VA_ARGS__) 135b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 136b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 1371e7c898533406da8a170dc0e951989bdc448c024Yann Collet/************************************** 1381e7c898533406da8a170dc0e951989bdc448c024Yann Collet* Benchmark Parameters 1391e7c898533406da8a170dc0e951989bdc448c024Yann Collet***************************************/ 140b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.static int chunkSize = DEFAULT_CHUNKSIZE; 141b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.static int nbIterations = NBLOOPS; 142b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.static int BMK_pause = 0; 143b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 144b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.void BMK_SetBlocksize(int bsize) { chunkSize = bsize; } 145b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 146b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.void BMK_SetNbIterations(int nbLoops) 147b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.{ 148b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. nbIterations = nbLoops; 149b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("- %i iterations -\n", nbIterations); 150b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.} 151b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 152f9c0666803ef64a2e591a7baeb26dd941bb6c9b8Yann Colletvoid BMK_SetPause(void) { BMK_pause = 1; } 153b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 154b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 1551e7c898533406da8a170dc0e951989bdc448c024Yann Collet/********************************************************* 1561e7c898533406da8a170dc0e951989bdc448c024Yann Collet* Private functions 1571e7c898533406da8a170dc0e951989bdc448c024Yann Collet**********************************************************/ 158b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 159b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#if defined(BMK_LEGACY_TIMER) 160b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 16120d25d8ae950966b6f050fa6d920e62e40501e75Yann Colletstatic int BMK_GetMilliStart(void) 162b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.{ 1631e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Based on Legacy ftime() 1641e7c898533406da8a170dc0e951989bdc448c024Yann Collet Rolls over every ~ 12.1 days (0x100000/24/60/60) 1651e7c898533406da8a170dc0e951989bdc448c024Yann Collet Use GetMilliSpan to correct for rollover */ 166b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. struct timeb tb; 167b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int nCount; 168b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. ftime( &tb ); 169b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. nCount = (int) (tb.millitm + (tb.time & 0xfffff) * 1000); 170b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. return nCount; 171b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.} 172b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 173b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#else 174b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 175f9c0666803ef64a2e591a7baeb26dd941bb6c9b8Yann Colletstatic int BMK_GetMilliStart(void) 176b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.{ 1771e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Based on newer gettimeofday() 1781e7c898533406da8a170dc0e951989bdc448c024Yann Collet Use GetMilliSpan to correct for rollover */ 179b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. struct timeval tv; 180b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int nCount; 181b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. gettimeofday(&tv, NULL); 182b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. nCount = (int) (tv.tv_usec/1000 + (tv.tv_sec & 0xfffff) * 1000); 183b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. return nCount; 184b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.} 185b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 186b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#endif 187b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 188b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 189b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.static int BMK_GetMilliSpan( int nTimeStart ) 190b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.{ 191b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int nSpan = BMK_GetMilliStart() - nTimeStart; 192b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if ( nSpan < 0 ) 193b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. nSpan += 0x100000 * 1000; 194b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. return nSpan; 195b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.} 196b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 197b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 198b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.static size_t BMK_findMaxMem(U64 requiredMem) 199b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.{ 2001e7c898533406da8a170dc0e951989bdc448c024Yann Collet size_t step = 64 MB; 201b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. BYTE* testmem=NULL; 202b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 203b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. requiredMem = (((requiredMem >> 26) + 1) << 26); 204b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. requiredMem += 2*step; 205b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if (requiredMem > MAX_MEM) requiredMem = MAX_MEM; 206b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 207b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. while (!testmem) 208b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 209b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. requiredMem -= step; 210b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. testmem = (BYTE*) malloc ((size_t)requiredMem); 211b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 212b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 213b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. free (testmem); 214b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. return (size_t) (requiredMem - step); 215b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.} 216b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 217b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 218b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.static U64 BMK_GetFileSize(char* infilename) 219b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.{ 220b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int r; 221b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#if defined(_MSC_VER) 222b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. struct _stat64 statbuf; 223b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. r = _stat64(infilename, &statbuf); 224b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#else 225b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. struct stat statbuf; 226b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. r = stat(infilename, &statbuf); 227b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#endif 2281e7c898533406da8a170dc0e951989bdc448c024Yann Collet if (r || !S_ISREG(statbuf.st_mode)) return 0; /* No good... */ 229b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. return (U64)statbuf.st_size; 230b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.} 231b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 232b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 2331e7c898533406da8a170dc0e951989bdc448c024Yann Collet/********************************************************* 2341e7c898533406da8a170dc0e951989bdc448c024Yann Collet* Public function 2351e7c898533406da8a170dc0e951989bdc448c024Yann Collet**********************************************************/ 236b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 237b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.int BMK_benchFile(char** fileNamesTable, int nbFiles, int cLevel) 238b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.{ 239b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int fileIdx=0; 240b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. char* orig_buff; 241b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. struct compressionParameters compP; 242b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int cfunctionId; 243b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 244b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. U64 totals = 0; 245b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. U64 totalz = 0; 246b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. double totalc = 0.; 247b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. double totald = 0.; 248b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 249b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 250bc1388ec7879a3ed2cd9dfac6c10cc6129f96f3eYann Collet /* Init */ 2516875c27f71d5eb85b54e742f75df5e7232c035dfyann.collet. if (cLevel <= 3) cfunctionId = 0; else cfunctionId = 1; 252b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. switch (cfunctionId) 253b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 254b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#ifdef COMPRESSOR0 255b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. case 0 : compP.compressionFunction = COMPRESSOR0; break; 256b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#endif 257b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#ifdef COMPRESSOR1 258b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. case 1 : compP.compressionFunction = COMPRESSOR1; break; 259b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.#endif 260b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. default : compP.compressionFunction = DEFAULTCOMPRESSOR; 261b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 262b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. compP.decompressionFunction = LZ4_decompress_fast; 263b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 2641e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Loop for each file */ 265b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. while (fileIdx<nbFiles) 266b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 267b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. FILE* inFile; 268b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. char* inFileName; 269b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. U64 inFileSize; 270b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. size_t benchedSize; 271b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int nbChunks; 272b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int maxCompressedChunkSize; 273b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. size_t readSize; 274b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. char* compressedBuffer; int compressedBuffSize; 275b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. struct chunkParameters* chunkP; 276b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. U32 crcOrig; 277b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 2781e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Check file existence */ 279b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. inFileName = fileNamesTable[fileIdx++]; 280b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. inFile = fopen( inFileName, "rb" ); 281b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if (inFile==NULL) 282b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 283b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY( "Pb opening %s\n", inFileName); 284b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. return 11; 285b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 286b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 2871e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Memory allocation & restrictions */ 288b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. inFileSize = BMK_GetFileSize(inFileName); 289b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. benchedSize = (size_t) BMK_findMaxMem(inFileSize * 2) / 2; 290b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if ((U64)benchedSize > inFileSize) benchedSize = (size_t)inFileSize; 291b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if (benchedSize < inFileSize) 292b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 293b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("Not enough memory for '%s' full size; testing %i MB only...\n", inFileName, (int)(benchedSize>>20)); 294b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 295b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 2961e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Alloc */ 297b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet. chunkP = (struct chunkParameters*) malloc(((benchedSize / (size_t)chunkSize)+1) * sizeof(struct chunkParameters)); 298b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. orig_buff = (char*)malloc((size_t )benchedSize); 299b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet. nbChunks = (int) ((int)benchedSize / chunkSize) + 1; 300b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. maxCompressedChunkSize = LZ4_compressBound(chunkSize); 301b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. compressedBuffSize = nbChunks * maxCompressedChunkSize; 302b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. compressedBuffer = (char*)malloc((size_t )compressedBuffSize); 303b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 304b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 305b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if (!orig_buff || !compressedBuffer) 306b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 307b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("\nError: not enough memory!\n"); 308b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. free(orig_buff); 309b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. free(compressedBuffer); 310b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. free(chunkP); 311b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. fclose(inFile); 312b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. return 12; 313b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 314b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 3151e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Init chunks data */ 316b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 317b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int i; 318b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. size_t remaining = benchedSize; 319b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. char* in = orig_buff; 320b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. char* out = compressedBuffer; 321b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. for (i=0; i<nbChunks; i++) 322b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 323b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. chunkP[i].id = i; 324b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. chunkP[i].origBuffer = in; in += chunkSize; 325b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if ((int)remaining > chunkSize) { chunkP[i].origSize = chunkSize; remaining -= chunkSize; } else { chunkP[i].origSize = (int)remaining; remaining = 0; } 326b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. chunkP[i].compressedBuffer = out; out += maxCompressedChunkSize; 327b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. chunkP[i].compressedSize = 0; 328b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 329b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 330b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 3311e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Fill input buffer */ 332b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("Loading %s... \r", inFileName); 333b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. readSize = fread(orig_buff, 1, benchedSize, inFile); 334b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. fclose(inFile); 335b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 336b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if (readSize != benchedSize) 337b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 338b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("\nError: problem reading file '%s' !! \n", inFileName); 339b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. free(orig_buff); 340b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. free(compressedBuffer); 341b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. free(chunkP); 342b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. return 13; 343b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 344b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 3451e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Calculating input Checksum */ 346b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. crcOrig = XXH32(orig_buff, (unsigned int)benchedSize,0); 347b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 348b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 3491e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Bench */ 350b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 351b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int loopNb, chunkNb; 352b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. size_t cSize=0; 353b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. double fastestC = 100000000., fastestD = 100000000.; 354b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. double ratio=0.; 355b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. U32 crcCheck=0; 356b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 357b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("\r%79s\r", ""); 358b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. for (loopNb = 1; loopNb <= nbIterations; loopNb++) 359b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 360b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int nbLoops; 361b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. int milliTime; 362b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 3631e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Compression */ 364b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("%1i-%-14.14s : %9i ->\r", loopNb, inFileName, (int)benchedSize); 3651e7c898533406da8a170dc0e951989bdc448c024Yann Collet { size_t i; for (i=0; i<benchedSize; i++) compressedBuffer[i]=(char)i; } /* warmimg up memory */ 366b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 367b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. nbLoops = 0; 368b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. milliTime = BMK_GetMilliStart(); 369b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. while(BMK_GetMilliStart() == milliTime); 370b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. milliTime = BMK_GetMilliStart(); 371b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. while(BMK_GetMilliSpan(milliTime) < TIMELOOP) 372b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 373b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. for (chunkNb=0; chunkNb<nbChunks; chunkNb++) 3746875c27f71d5eb85b54e742f75df5e7232c035dfyann.collet. chunkP[chunkNb].compressedSize = compP.compressionFunction(chunkP[chunkNb].origBuffer, chunkP[chunkNb].compressedBuffer, chunkP[chunkNb].origSize, cLevel); 375b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. nbLoops++; 376b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 377b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. milliTime = BMK_GetMilliSpan(milliTime); 378b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 379b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if ((double)milliTime < fastestC*nbLoops) fastestC = (double)milliTime/nbLoops; 380b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. cSize=0; for (chunkNb=0; chunkNb<nbChunks; chunkNb++) cSize += chunkP[chunkNb].compressedSize; 381b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. ratio = (double)cSize/(double)benchedSize*100.; 382b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 383b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("%1i-%-14.14s : %9i -> %9i (%5.2f%%),%7.1f MB/s\r", loopNb, inFileName, (int)benchedSize, (int)cSize, ratio, (double)benchedSize / fastestC / 1000.); 384b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 3851e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* Decompression */ 3861e7c898533406da8a170dc0e951989bdc448c024Yann Collet { size_t i; for (i=0; i<benchedSize; i++) orig_buff[i]=0; } /* zeroing area, for CRC checking */ 387b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 388b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. nbLoops = 0; 389b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. milliTime = BMK_GetMilliStart(); 390b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. while(BMK_GetMilliStart() == milliTime); 391b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. milliTime = BMK_GetMilliStart(); 392b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. while(BMK_GetMilliSpan(milliTime) < TIMELOOP) 393b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 394b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. for (chunkNb=0; chunkNb<nbChunks; chunkNb++) 395b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. chunkP[chunkNb].compressedSize = LZ4_decompress_fast(chunkP[chunkNb].compressedBuffer, chunkP[chunkNb].origBuffer, chunkP[chunkNb].origSize); 396b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. nbLoops++; 397b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 398b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. milliTime = BMK_GetMilliSpan(milliTime); 399b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 400b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if ((double)milliTime < fastestD*nbLoops) fastestD = (double)milliTime/nbLoops; 401b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("%1i-%-14.14s : %9i -> %9i (%5.2f%%),%7.1f MB/s ,%7.1f MB/s\r", loopNb, inFileName, (int)benchedSize, (int)cSize, ratio, (double)benchedSize / fastestC / 1000., (double)benchedSize / fastestD / 1000.); 402b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 4031e7c898533406da8a170dc0e951989bdc448c024Yann Collet /* CRC Checking */ 404b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. crcCheck = XXH32(orig_buff, (unsigned int)benchedSize,0); 405b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if (crcOrig!=crcCheck) { DISPLAY("\n!!! WARNING !!! %14s : Invalid Checksum : %x != %x\n", inFileName, (unsigned)crcOrig, (unsigned)crcCheck); break; } 406b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 407b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 408b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if (crcOrig==crcCheck) 409b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. { 410b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if (ratio<100.) 411b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("%-16.16s : %9i -> %9i (%5.2f%%),%7.1f MB/s ,%7.1f MB/s\n", inFileName, (int)benchedSize, (int)cSize, ratio, (double)benchedSize / fastestC / 1000., (double)benchedSize / fastestD / 1000.); 412b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. else 413b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("%-16.16s : %9i -> %9i (%5.1f%%),%7.1f MB/s ,%7.1f MB/s \n", inFileName, (int)benchedSize, (int)cSize, ratio, (double)benchedSize / fastestC / 1000., (double)benchedSize / fastestD / 1000.); 414b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 415b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. totals += benchedSize; 416b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. totalz += cSize; 417b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. totalc += fastestC; 418b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. totald += fastestD; 419b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 420b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 421b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. free(orig_buff); 422b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. free(compressedBuffer); 423b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. free(chunkP); 424b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. } 425b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 426b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if (nbFiles > 1) 427b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. DISPLAY("%-16.16s :%10llu ->%10llu (%5.2f%%), %6.1f MB/s , %6.1f MB/s\n", " TOTAL", (long long unsigned int)totals, (long long unsigned int)totalz, (double)totalz/(double)totals*100., (double)totals/totalc/1000., (double)totals/totald/1000.); 428b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 429b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. if (BMK_pause) { DISPLAY("\npress enter...\n"); getchar(); } 430b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 431b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. return 0; 432b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet.} 433b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 434b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 435b4bb2abaae96fc64eb20085b0f8dc0c8d5827818yann.collet. 436