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