fullbench.c revision dd14dca15cd595f28e820d9a5ab31e151bd9aa76
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    bench.c - Demo program to benchmark open-source compression algorithm
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Copyright (C) Yann Collet 2012-2015
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GPL v2 License
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    This program is free software; you can redistribute it and/or modify
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    it under the terms of the GNU General Public License as published by
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    the Free Software Foundation; either version 2 of the License, or
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    (at your option) any later version.
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    This program is distributed in the hope that it will be useful,
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    but WITHOUT ANY WARRANTY; without even the implied warranty of
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GNU General Public License for more details.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
171c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    You should have received a copy of the GNU General Public License along
181c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    with this program; if not, write to the Free Software Foundation, Inc.,
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    You can contact the author at :
2290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian    - LZ4 source repository : https://github.com/lz4/lz4
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
24a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian*/
25076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
26a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian/**************************************
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*  Compiler Options
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**************************************/
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* Disable some Visual warning messages */
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define _CRT_SECURE_NO_WARNINGS
311c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis#define _CRT_SECURE_NO_DEPRECATE     /* VS2005 */
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
333330b203039dea366d4981db1408a460134b2d2cMathias Agopian/* Unix Large Files support (>4GB) */
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if (defined(__sun__) && (!defined(__LP64__)))   // Sun Solaris 32-bits requires specific definitions
359cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#  define _LARGEFILE_SOURCE
3690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#  define _FILE_OFFSET_BITS 64
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#elif ! defined(__LP64__)                        // No point defining Large file for 64 bit
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#  define _LARGEFILE64_SOURCE
39a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#endif
40a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
411f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian// S_ISREG & gettimeofday() are not supported by MSVC
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(_MSC_VER) || defined(_WIN32)
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#  define BMK_LEGACY_TIMER 1
44a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#endif
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/**************************************
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*  Includes
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**************************************/
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>      /* malloc, free */
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>       /* fprintf, fopen, ftello64 */
5296f0819f81293076e652792794a961543e6750d7Mathias Agopian#include <sys/types.h>   /* stat64 */
5396f0819f81293076e652792794a961543e6750d7Mathias Agopian#include <sys/stat.h>    /* stat64 */
5496f0819f81293076e652792794a961543e6750d7Mathias Agopian#include <string.h>      /* strcmp */
55a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <time.h>        /* clock_t, clock(), CLOCKS_PER_SEC */
56a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
57a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include "lz4.h"
58933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian#include "lz4hc.h"
59a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include "lz4frame.h"
604d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian
6182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian#include "xxhash.h"
6282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
635bf3abefb2745bf0c45b0814cfd44b4682060a6cMathias Agopian
641f7bec634f19c123410a5155c8d282e177c01930Mathias Agopian/**************************************
65a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian*  Compiler Options
66d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian**************************************/
67b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian/* S_ISREG & gettimeofday() are not supported by MSVC */
68933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian#if !defined(S_ISREG)
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#  define S_ISREG(x) (((x) & S_IFMT) == S_IFREG)
70a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#endif
71a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
72e8696a40e09b24b634214684d18526187b316a2fJamie Gennis
73e8696a40e09b24b634214684d18526187b316a2fJamie Gennis/**************************************
74e8696a40e09b24b634214684d18526187b316a2fJamie Gennis*  Basic Types
75e8696a40e09b24b634214684d18526187b316a2fJamie Gennis**************************************/
7682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* C99 */
7782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian# include <stdint.h>
7882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian  typedef uint8_t  BYTE;
7982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian  typedef uint16_t U16;
80e8696a40e09b24b634214684d18526187b316a2fJamie Gennis  typedef uint32_t U32;
81e8696a40e09b24b634214684d18526187b316a2fJamie Gennis  typedef  int32_t S32;
82e8696a40e09b24b634214684d18526187b316a2fJamie Gennis  typedef uint64_t U64;
83d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian#else
84d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian  typedef unsigned char       BYTE;
85a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian  typedef unsigned short      U16;
8696f0819f81293076e652792794a961543e6750d7Mathias Agopian  typedef unsigned int        U32;
87a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian  typedef   signed int        S32;
88ddc31c3e2bc6ffe66695c385d23e8ccc3c6dad06Mathias Agopian  typedef unsigned long long  U64;
89a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#endif
90a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
91a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
92a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian/**************************************
93a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian*  Constants
94a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian**************************************/
95a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#define PROGRAM_DESCRIPTION "LZ4 speed analyzer"
96a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#define AUTHOR "Yann Collet"
97a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#define WELCOME_MESSAGE "*** %s v%s %i-bits, by %s ***\n", PROGRAM_DESCRIPTION, LZ4_VERSION_STRING, (int)(sizeof(void*)*8), AUTHOR
98a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
99a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#define NBLOOPS    6
100b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam#define TIMELOOP   (CLOCKS_PER_SEC * 25 / 10)
101b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
102b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam#define KB *(1 <<10)
103b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam#define MB *(1 <<20)
104a0db308c3d62301ae41b2e2bcf295c4ee4c7b08eMathias Agopian#define GB *(1U<<30)
105b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
106b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam#define KNUTH      2654435761U
107a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#define MAX_MEM    (1920 MB)
108a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#define DEFAULT_CHUNKSIZE   (4 MB)
109b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
1107f42a9c47c5a7f40cf02032d286d6bd62f28e650Mathias Agopian#define ALL_COMPRESSORS 0
1117f42a9c47c5a7f40cf02032d286d6bd62f28e650Mathias Agopian#define ALL_DECOMPRESSORS 0
112a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
1137f42a9c47c5a7f40cf02032d286d6bd62f28e650Mathias Agopian
1147f42a9c47c5a7f40cf02032d286d6bd62f28e650Mathias Agopian/**************************************
115303d538bb012e82c6b9a98c4930a03455000f761Mathias Agopian*  Local structures
116b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian**************************************/
11796f0819f81293076e652792794a961543e6750d7Mathias Agopianstruct chunkParameters
118a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
119b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    U32   id;
120118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian    char* origBuffer;
121118d0245ee0a3b107055782aa8b555404b6f0280Mathias Agopian    char* compressedBuffer;
12296f0819f81293076e652792794a961543e6750d7Mathias Agopian    int   origSize;
12396f0819f81293076e652792794a961543e6750d7Mathias Agopian    int   compressedSize;
124a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian};
1253d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis
12699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
127579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian/**************************************
128579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian*  Macros
129d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian**************************************/
130d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian#define DISPLAY(...) fprintf(stderr, __VA_ARGS__)
131d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian#define PROGRESS(...) g_noPrompt ? 0 : DISPLAY(__VA_ARGS__)
132d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian
133dbe6486ca151d0eb1950be0aae347f0eb8ed3442Jamie Gennis
13448d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian/**************************************
135cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian*  Benchmark Parameters
136a249f2d11249ff37c48119020b797ad437ddef2cJamie Gennis**************************************/
137a249f2d11249ff37c48119020b797ad437ddef2cJamie Gennisstatic int g_chunkSize = DEFAULT_CHUNKSIZE;
138a249f2d11249ff37c48119020b797ad437ddef2cJamie Gennisstatic int g_nbIterations = NBLOOPS;
139a249f2d11249ff37c48119020b797ad437ddef2cJamie Gennisstatic int g_pause = 0;
140a249f2d11249ff37c48119020b797ad437ddef2cJamie Gennisstatic int g_compressionTest = 1;
141b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lamstatic int g_compressionAlgo = ALL_COMPRESSORS;
142b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lamstatic int g_decompressionTest = 1;
143b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lamstatic int g_decompressionAlgo = ALL_DECOMPRESSORS;
144b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lamstatic int g_noPrompt = 0;
145b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
146b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lamstatic void BMK_setBlocksize(int bsize)
147b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam{
148b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam    g_chunkSize = bsize;
149a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    DISPLAY("-Using Block Size of %i KB-\n", g_chunkSize>>10);
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
151a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
152a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianstatic void BMK_setNbIterations(int nbLoops)
153a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
154a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    g_nbIterations = nbLoops;
155a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    DISPLAY("- %i iterations -\n", g_nbIterations);
156a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
157b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
158a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianstatic void BMK_setPause(void)
159a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
160a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    g_pause = 1;
161a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
162a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
163a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
164a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian/*********************************************************
165a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian*  Private functions
166a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian*********************************************************/
167a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopianstatic clock_t BMK_GetClockSpan( clock_t clockStart )
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return clock() - clockStart;   /* works even if overflow; max span ~30 mn */
170582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
171582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
172b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
173582270d69db94286a248bd829f1ae6f910d45124Jamie Gennisstatic size_t BMK_findMaxMem(U64 requiredMem)
174582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis{
175f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    size_t step = 64 MB;
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    BYTE* testmem=NULL;
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
178401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    requiredMem = (((requiredMem >> 26) + 1) << 26);
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requiredMem += 2*step;
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (requiredMem > MAX_MEM) requiredMem = MAX_MEM;
181ff615cc7a1cceedd705b0623b058c54669b29596Mathias Agopian
182ff615cc7a1cceedd705b0623b058c54669b29596Mathias Agopian    while (!testmem) {
183ff615cc7a1cceedd705b0623b058c54669b29596Mathias Agopian        if (requiredMem > step) requiredMem -= step;
184ff615cc7a1cceedd705b0623b058c54669b29596Mathias Agopian        else requiredMem >>= 1;
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        testmem = (BYTE*) malloc ((size_t)requiredMem);
186401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    }
187401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    free (testmem);
188ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian
189ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian    /* keep some space available */
190ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian    if (requiredMem > step) requiredMem -= step;
191ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian    else requiredMem >>= 1;
192ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian
193ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian    return (size_t)requiredMem;
194ff615cc7a1cceedd705b0623b058c54669b29596Mathias Agopian}
195ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian
196ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian
197ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopianstatic U64 BMK_GetFileSize(const char* infilename)
198401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian{
199401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    int r;
200a4b740ed89074cda898a30eb1b029b0d3a5de1a5Mathias Agopian#if defined(_MSC_VER)
201a4b740ed89074cda898a30eb1b029b0d3a5de1a5Mathias Agopian    struct _stat64 statbuf;
202cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    r = _stat64(infilename, &statbuf);
203eff062c49e858d0dd94a1e57f6115bc84dba103eMathias Agopian#else
2043330b203039dea366d4981db1408a460134b2d2cMathias Agopian    struct stat statbuf;
20516f0453fee84c6aad59fe0d1c7d36f061d46cffcGlenn Kasten    r = stat(infilename, &statbuf);
206a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#endif
207a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (r || !S_ISREG(statbuf.st_mode)) return 0;   /* No good... */
208a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    return (U64)statbuf.st_size;
209a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
210a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
211b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam
212ca99fb8f65f3ea249c56fb6dccefffb54e87696eMathias Agopian/*********************************************************
213401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian*  Benchmark function
214401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian*********************************************************/
215401c257fba770a267f637184b1f532b4e03bed20Mathias Agopianstatic LZ4_stream_t LZ4_stream;
216401c257fba770a267f637184b1f532b4e03bed20Mathias Agopianstatic void local_LZ4_resetDictT(void)
217401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian{
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LZ4_resetStream(&LZ4_stream);
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
221f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatic void local_LZ4_createStream(void)
222f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis{
223f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    LZ4_resetStream(&LZ4_stream);
224f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
225f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
226f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatic int local_LZ4_saveDict(const char* in, char* out, int inSize)
227f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis{
228f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    (void)in;
229f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return LZ4_saveDict(&LZ4_stream, out, inSize);
230f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
231f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
232f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatic int local_LZ4_compress_limitedOutput(const char* in, char* out, int inSize)
233f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis{
234f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return LZ4_compress_limitedOutput(in, out, inSize, LZ4_compressBound(inSize)-1);
23593ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian}
236f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
237f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatic int local_LZ4_compress_default_large(const char* in, char* out, int inSize)
238f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis{
239f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return LZ4_compress_default(in, out, inSize, LZ4_compressBound(inSize));
24093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian}
24193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian
242f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatic int local_LZ4_compress_default_small(const char* in, char* out, int inSize)
243f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis{
244f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return LZ4_compress_default(in, out, inSize, LZ4_compressBound(inSize)-1);
24593ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian}
24693ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian
247f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatic int local_LZ4_compress_fast0(const char* in, char* out, int inSize)
24893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian{
24993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    return LZ4_compress_fast(in, out, inSize, LZ4_compressBound(inSize), 0);
250f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
251f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
252f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatic int local_LZ4_compress_fast1(const char* in, char* out, int inSize)
25393ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian{
25493ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    return LZ4_compress_fast(in, out, inSize, LZ4_compressBound(inSize), 1);
25593ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian}
25693ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian
257f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatic int local_LZ4_compress_fast2(const char* in, char* out, int inSize)
258f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis{
259f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return LZ4_compress_fast(in, out, inSize, LZ4_compressBound(inSize), 2);
260f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
261f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
262a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopianstatic int local_LZ4_compress_fast17(const char* in, char* out, int inSize)
263a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
264a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    return LZ4_compress_fast(in, out, inSize, LZ4_compressBound(inSize), 17);
265a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian}
266a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
267a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopianstatic int local_LZ4_compress_fast_extState0(const char* in, char* out, int inSize)
268a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
269a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    return LZ4_compress_fast_extState(&LZ4_stream, in, out, inSize, LZ4_compressBound(inSize), 0);
270a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
271a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
272a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopianstatic int local_LZ4_compress_fast_continue0(const char* in, char* out, int inSize)
273a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
27429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian    return LZ4_compress_fast_continue(&LZ4_stream, in, out, inSize, LZ4_compressBound(inSize), 0);
27529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian}
27629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
27729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopianstatic int local_LZ4_compress_withState(const char* in, char* out, int inSize)
27829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian{
279d992db3827016388e8069f5793b031153d423501Mathias Agopian    return LZ4_compress_withState(&LZ4_stream, in, out, inSize);
28029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian}
28129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
28229a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopianstatic int local_LZ4_compress_limitedOutput_withState(const char* in, char* out, int inSize)
28329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian{
284d992db3827016388e8069f5793b031153d423501Mathias Agopian    return LZ4_compress_limitedOutput_withState(&LZ4_stream, in, out, inSize, LZ4_compressBound(inSize)-1);
28529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian}
28629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian
28729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopianstatic int local_LZ4_compress_continue(const char* in, char* out, int inSize)
28829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian{
289a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    return LZ4_compress_continue(&LZ4_stream, in, out, inSize);
29029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian}
291a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
292a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopianstatic int local_LZ4_compress_limitedOutput_continue(const char* in, char* out, int inSize)
293a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian{
294a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian    return LZ4_compress_limitedOutput_continue(&LZ4_stream, in, out, inSize, LZ4_compressBound(inSize)-1);
295f345069099a13f0c2dd91f1fa92786643e4becb0Mathias Agopian}
296f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
297f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis#ifndef LZ4_DLL_IMPORT
298f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis/* declare hidden function */
299f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisint LZ4_compress_forceExtDict (LZ4_stream_t* LZ4_stream, const char* source, char* dest, int inputSize);
300f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
301a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopianstatic int local_LZ4_compress_forceDict(const char* in, char* out, int inSize)
302a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{
303c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian    return LZ4_compress_forceExtDict(&LZ4_stream, in, out, inSize);
304c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian}
305c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian#endif
306c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian
307c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian
308c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian/* HC compression functions */
309c7f3381c3b2945e441747130eae88214435d0819Mathias AgopianLZ4_streamHC_t LZ4_streamHC;
310c7f3381c3b2945e441747130eae88214435d0819Mathias Agopianstatic void local_LZ4_resetStreamHC(void)
311c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian{
312c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian    LZ4_resetStreamHC(&LZ4_streamHC, 0);
313c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian}
314c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian
315c7f3381c3b2945e441747130eae88214435d0819Mathias Agopianstatic int local_LZ4_saveDictHC(const char* in, char* out, int inSize)
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    (void)in;
3181c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis    return LZ4_saveDictHC(&LZ4_streamHC, out, inSize);
3191c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis}
320a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic int local_LZ4_compressHC_withStateHC(const char* in, char* out, int inSize)
322179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian{
323179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian    return LZ4_compressHC_withStateHC(&LZ4_streamHC, in, out, inSize);
324179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian}
325179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
326179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopianstatic int local_LZ4_compressHC_limitedOutput_withStateHC(const char* in, char* out, int inSize)
327179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian{
328179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian    return LZ4_compressHC_limitedOutput_withStateHC(&LZ4_streamHC, in, out, inSize, LZ4_compressBound(inSize)-1);
329179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian}
330179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
331f7ae69d4bd292110da976c8ae766a8ef083d731fMathias Agopianstatic int local_LZ4_compressHC_limitedOutput(const char* in, char* out, int inSize)
332f7ae69d4bd292110da976c8ae766a8ef083d731fMathias Agopian{
333179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian    return LZ4_compressHC_limitedOutput(in, out, inSize, LZ4_compressBound(inSize)-1);
334179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian}
335179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
336179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopianstatic int local_LZ4_compressHC_continue(const char* in, char* out, int inSize)
337179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian{
338179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian    return LZ4_compressHC_continue(&LZ4_streamHC, in, out, inSize);
339179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian}
340179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian
341179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopianstatic int local_LZ4_compressHC_limitedOutput_continue(const char* in, char* out, int inSize)
342179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian{
3430a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian    return LZ4_compressHC_limitedOutput_continue(&LZ4_streamHC, in, out, inSize, LZ4_compressBound(inSize)-1);
344179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian}
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
347a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian/* decompression functions */
3489575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennisstatic int local_LZ4_decompress_fast(const char* in, char* out, int inSize, int outSize)
349cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis{
350cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis    (void)inSize;
351cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis    LZ4_decompress_fast(in, out, outSize);
352cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis    return outSize;
353cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis}
354cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis
355cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennisstatic int local_LZ4_decompress_fast_usingDict(const char* in, char* out, int inSize, int outSize)
356cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis{
357cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis    (void)inSize;
358c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    LZ4_decompress_fast_usingDict(in, out, outSize, out - 65536, 65536);
359c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    return outSize;
360cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis}
361c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian
3629575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennisstatic int local_LZ4_decompress_safe_usingDict(const char* in, char* out, int inSize, int outSize)
363c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian{
364c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    (void)inSize;
3659575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis    LZ4_decompress_safe_usingDict(in, out, inSize, outSize, out - 65536, 65536);
366cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis    return outSize;
3679575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis}
368c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian
3694c4163b53e262ff9cc10c819321d4ae03c2d7d46Xavier Ducrohet#ifndef LZ4_DLL_IMPORT
370a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianextern int LZ4_decompress_safe_forceExtDict(const char* in, char* out, int inSize, int outSize, const char* dict, int dictSize);
371c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian
3729575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennisstatic int local_LZ4_decompress_safe_forceExtDict(const char* in, char* out, int inSize, int outSize)
3739575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis{
3749575f60722f7a4f54384fe0be6938a8de48dc23aJamie Gennis    (void)inSize;
375c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    LZ4_decompress_safe_forceExtDict(in, out, inSize, outSize, out - 65536, 65536);
376c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    return outSize;
377a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
378a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#endif
379a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
380a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianstatic int local_LZ4_decompress_safe_partial(const char* in, char* out, int inSize, int outSize)
381c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian{
382c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    return LZ4_decompress_safe_partial(in, out, inSize, outSize - 5, outSize);
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
385ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
386ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold/* frame functions */
387ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassoldstatic int local_LZ4F_compressFrame(const char* in, char* out, int inSize)
388ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold{
389ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    return (int)LZ4F_compressFrame(out, 2*inSize + 16, in, inSize, NULL);
390ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold}
391ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
392a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianstatic LZ4F_decompressionContext_t g_dCtx;
393ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
394a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianstatic int local_LZ4F_decompress(const char* in, char* out, int inSize, int outSize)
395a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
396ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    size_t srcSize = inSize;
397a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    size_t dstSize = outSize;
398a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    size_t result;
399a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    result = LZ4F_decompress(g_dCtx, out, &dstSize, in, &srcSize, NULL);
400a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    if (result!=0) { DISPLAY("Error decompressing frame : unfinished frame\n"); exit(8); }
401ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    if (srcSize != (size_t)inSize) { DISPLAY("Error decompressing frame : read size incorrect\n"); exit(9); }
402ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold    return (int)dstSize;
403ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold}
404a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
405a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian
406a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#define NB_COMPRESSION_ALGORITHMS 100
407a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#define NB_DECOMPRESSION_ALGORITHMS 100
408db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennisint fullSpeedBench(const char** fileNamesTable, int nbFiles)
409a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
410db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis    int fileIdx=0;
411a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
412a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    /* Init */
413a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    { size_t const errorCode = LZ4F_createDecompressionContext(&g_dCtx, LZ4F_VERSION);
414a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian      if (LZ4F_isError(errorCode)) { DISPLAY("dctx allocation issue \n"); return 10; } }
415a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian
416a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian    /* Loop for each fileName */
4177a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    while (fileIdx<nbFiles) {
4187a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis      char* orig_buff = NULL;
419a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian      struct chunkParameters* chunkP = NULL;
4207a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis      char* compressed_buff=NULL;
4217a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis      const char* const inFileName = fileNamesTable[fileIdx++];
4227a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis      FILE* const inFile = fopen( inFileName, "rb" );
423b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian      U64   inFileSize;
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      size_t benchedSize;
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      int nbChunks;
4261c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis      int maxCompressedChunkSize;
4271c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis      size_t readSize;
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      int compressedBuffSize;
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      U32 crcOriginal;
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      size_t errorCode;
43193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian
43293ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian      /* Check file existence */
433a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian      if (inFile==NULL) { DISPLAY( "Pb opening %s\n", inFileName); return 11; }
434a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
435cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian      /* Memory size adjustments */
4369d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block      inFileSize = BMK_GetFileSize(inFileName);
4373fbce7c56082e4e0d23f1c1c89983d3841853ed7Mathias Agopian      if (inFileSize==0) { DISPLAY( "file is empty\n"); fclose(inFile); return 11; }
438b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      benchedSize = BMK_findMaxMem(inFileSize*2) / 2;   /* because 2 buffers */
439b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      if (benchedSize==0) { DISPLAY( "not enough memory\n"); fclose(inFile); return 11; }
4403fbce7c56082e4e0d23f1c1c89983d3841853ed7Mathias Agopian      if ((U64)benchedSize > inFileSize) benchedSize = (size_t)inFileSize;
441a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian      if (benchedSize < inFileSize)
44293ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian          DISPLAY("Not enough memory for '%s' full size; testing %i MB only...\n", inFileName, (int)(benchedSize>>20));
44393ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian
444b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      /* Allocation */
445b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      chunkP = (struct chunkParameters*) malloc(((benchedSize / (size_t)g_chunkSize)+1) * sizeof(struct chunkParameters));
446b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      orig_buff = (char*) malloc(benchedSize);
447b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      nbChunks = (int) ((benchedSize + (g_chunkSize-1)) / g_chunkSize);
448b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      maxCompressedChunkSize = LZ4_compressBound(g_chunkSize);
449b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      compressedBuffSize = nbChunks * maxCompressedChunkSize;
450b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      compressed_buff = (char*)malloc((size_t)compressedBuffSize);
451b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      if(!chunkP || !orig_buff || !compressed_buff) {
452b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian          DISPLAY("\nError: not enough memory!\n");
453b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian          fclose(inFile);
454b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian          free(orig_buff);
455b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian          free(compressed_buff);
4563fbce7c56082e4e0d23f1c1c89983d3841853ed7Mathias Agopian          free(chunkP);
457a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian          return(12);
458a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian      }
459a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
460b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      /* Fill in src buffer */
461a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian      DISPLAY("Loading %s...       \r", inFileName);
462b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian      readSize = fread(orig_buff, 1, benchedSize, inFile);
463a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian      fclose(inFile);
4642a0d5b608447a880beff5149805425f02691442bJamie Gennis
4652a0d5b608447a880beff5149805425f02691442bJamie Gennis      if (readSize != benchedSize) {
4662a0d5b608447a880beff5149805425f02691442bJamie Gennis        DISPLAY("\nError: problem reading file '%s' !!    \n", inFileName);
467b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian        free(orig_buff);
468b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian        free(compressed_buff);
469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        free(chunkP);
470cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian        return 13;
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      }
472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      /* Calculating input Checksum */
474a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian      crcOriginal = XXH32(orig_buff, benchedSize,0);
475933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian
476a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
477a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian      /* Bench */
478a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian      { int loopNb, nb_loops, chunkNb, cAlgNb, dAlgNb;
479a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        size_t cSize=0;
480a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        double ratio=0.;
481a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        DISPLAY("\r%79s\r", "");
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        DISPLAY(" %s : \n", inFileName);
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        /* Bench Compression Algorithms */
4864d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian        for (cAlgNb=0; (cAlgNb <= NB_COMPRESSION_ALGORITHMS) && (g_compressionTest); cAlgNb++) {
4874d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian            const char* compressorName;
4884d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian            int (*compressionFunction)(const char*, char*, int);
48999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            void (*initFunction)(void) = NULL;
49099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            double bestTime = 100000000.;
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            /* filter compressionAlgo only */
4931c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis            if ((g_compressionAlgo != ALL_COMPRESSORS) && (g_compressionAlgo != cAlgNb)) continue;
4941c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
4953d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis            /* Init data chunks */
49699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            {   int i;
49799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                size_t remaining = benchedSize;
49899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                char* in = orig_buff;
49999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                char* out = compressed_buff;
50099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                nbChunks = (int) (((int)benchedSize + (g_chunkSize-1))/ g_chunkSize);
50199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                for (i=0; i<nbChunks; i++) {
5024d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian                    chunkP[i].id = i;
5034d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian                    chunkP[i].origBuffer = in; in += g_chunkSize;
50499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                    if ((int)remaining > g_chunkSize) { chunkP[i].origSize = g_chunkSize; remaining -= g_chunkSize; } else { chunkP[i].origSize = (int)remaining; remaining = 0; }
50599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                    chunkP[i].compressedBuffer = out; out += maxCompressedChunkSize;
5064d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian                    chunkP[i].compressedSize = 0;
50799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian                }
508351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis            }
509db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis
510351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis            switch(cAlgNb)
511db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis            {
5123d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis            case 0 : DISPLAY("Compression functions : \n"); continue;
5133d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis            case 1 : compressionFunction = local_LZ4_compress_default_large; compressorName = "LZ4_compress_default"; break;
51499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian            case 2 : compressionFunction = local_LZ4_compress_default_small; compressorName = "LZ4_compress_default(small dst)"; break;
5153d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis            case 3 : compressionFunction = local_LZ4_compress_fast0; compressorName = "LZ4_compress_fast(0)"; break;
5163d8063b02e06020c8062addcc9ec49048d3bdb9aJamie Gennis            case 4 : compressionFunction = local_LZ4_compress_fast1; compressorName = "LZ4_compress_fast(1)"; break;
517a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            case 5 : compressionFunction = local_LZ4_compress_fast2; compressorName = "LZ4_compress_fast(2)"; break;
518a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            case 6 : compressionFunction = local_LZ4_compress_fast17; compressorName = "LZ4_compress_fast(17)"; break;
519a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            case 7 : compressionFunction = local_LZ4_compress_fast_extState0; compressorName = "LZ4_compress_fast_extState(0)"; break;
520a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            case 8 : compressionFunction = local_LZ4_compress_fast_continue0; initFunction = local_LZ4_createStream; compressorName = "LZ4_compress_fast_continue(0)"; break;
521a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
522d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian            case 10: compressionFunction = LZ4_compressHC; compressorName = "LZ4_compressHC"; break;
523351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis            case 11: compressionFunction = local_LZ4_compressHC_limitedOutput; compressorName = "LZ4_compressHC_limitedOutput"; break;
524351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis            case 12 : compressionFunction = local_LZ4_compressHC_withStateHC; compressorName = "LZ4_compressHC_withStateHC"; break;
525e8696a40e09b24b634214684d18526187b316a2fJamie Gennis            case 13: compressionFunction = local_LZ4_compressHC_limitedOutput_withStateHC; compressorName = "LZ4_compressHC_limitedOutput_withStateHC"; break;
526ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold            case 14: compressionFunction = local_LZ4_compressHC_continue; initFunction = local_LZ4_resetStreamHC; compressorName = "LZ4_compressHC_continue"; break;
527ec923ee0d0e6f95bd56275214c252cb57bb8cfd4Mathias Agopian            case 15: compressionFunction = local_LZ4_compressHC_limitedOutput_continue; initFunction = local_LZ4_resetStreamHC; compressorName = "LZ4_compressHC_limitedOutput_continue"; break;
528ec923ee0d0e6f95bd56275214c252cb57bb8cfd4Mathias Agopian#ifndef LZ4_DLL_IMPORT
529ec923ee0d0e6f95bd56275214c252cb57bb8cfd4Mathias Agopian			case 20: compressionFunction = local_LZ4_compress_forceDict; initFunction = local_LZ4_resetDictT; compressorName = "LZ4_compress_forceDict"; break;
530ec923ee0d0e6f95bd56275214c252cb57bb8cfd4Mathias Agopian#endif
531ec923ee0d0e6f95bd56275214c252cb57bb8cfd4Mathias Agopian			case 30: compressionFunction = local_LZ4F_compressFrame; compressorName = "LZ4F_compressFrame";
532ec923ee0d0e6f95bd56275214c252cb57bb8cfd4Mathias Agopian                        chunkP[0].origSize = (int)benchedSize; nbChunks=1;
533161534a3c5ee77bc91e7a73ffb6274f35324f8b5Jamie Gennis                        break;
534a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            case 40: compressionFunction = local_LZ4_saveDict; compressorName = "LZ4_saveDict";
535933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian                        LZ4_loadDict(&LZ4_stream, chunkP[0].origBuffer, chunkP[0].origSize);
536933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian                        break;
537933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian            case 41: compressionFunction = local_LZ4_saveDictHC; compressorName = "LZ4_saveDictHC";
538933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian                        LZ4_loadDictHC(&LZ4_streamHC, chunkP[0].origBuffer, chunkP[0].origSize);
539933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian                        break;
540a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            case 60: DISPLAY("Obsolete compression functions : \n"); continue;
541a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            case 61: compressionFunction = LZ4_compress; compressorName = "LZ4_compress"; break;
542933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian            case 62: compressionFunction = local_LZ4_compress_limitedOutput; compressorName = "LZ4_compress_limitedOutput"; break;
543a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            case 63: compressionFunction = local_LZ4_compress_withState; compressorName = "LZ4_compress_withState"; break;
544a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            case 64: compressionFunction = local_LZ4_compress_limitedOutput_withState; compressorName = "LZ4_compress_limitedOutput_withState"; break;
545da9584dc295cc5e6d0b49a97c1e45159249d650bMathias Agopian            case 65: compressionFunction = local_LZ4_compress_continue; initFunction = local_LZ4_createStream; compressorName = "LZ4_compress_continue"; break;
546351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis            case 66: compressionFunction = local_LZ4_compress_limitedOutput_continue; initFunction = local_LZ4_createStream; compressorName = "LZ4_compress_limitedOutput_continue"; break;
547351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis            default :
548351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis                continue;   /* unknown ID : just skip */
549351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis            }
550351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis
551c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian            for (loopNb = 1; loopNb <= g_nbIterations; loopNb++) {
552c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian                double averageTime;
553c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian                clock_t clockTime;
554c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian
555351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis                PROGRESS("%1i- %-28.28s :%9i ->\r", loopNb, compressorName, (int)benchedSize);
556db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis                { size_t i; for (i=0; i<benchedSize; i++) compressed_buff[i]=(char)i; }     /* warming up memory */
557ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold
558ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold                nb_loops = 0;
559ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold                clockTime = clock();
560f7ae69d4bd292110da976c8ae766a8ef083d731fMathias Agopian                while(clock() == clockTime);
561f7ae69d4bd292110da976c8ae766a8ef083d731fMathias Agopian                clockTime = clock();
562d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian                while(BMK_GetClockSpan(clockTime) < TIMELOOP) {
563a402c4c9913cfbc6c3da21719c57a93a11f091f0Jamie Gennis                    if (initFunction!=NULL) initFunction();
564d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian                    for (chunkNb=0; chunkNb<nbChunks; chunkNb++) {
565a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                        chunkP[chunkNb].compressedSize = compressionFunction(chunkP[chunkNb].origBuffer, chunkP[chunkNb].compressedBuffer, chunkP[chunkNb].origSize);
566a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                        if (chunkP[chunkNb].compressedSize==0) DISPLAY("ERROR ! %s() = 0 !! \n", compressorName), exit(1);
56793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian                    }
568a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                    nb_loops++;
569b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian                }
57097c602c5af5f3ffd69009bf496d86347b71a2b4cMathias Agopian                clockTime = BMK_GetClockSpan(clockTime);
57197c602c5af5f3ffd69009bf496d86347b71a2b4cMathias Agopian
57297c602c5af5f3ffd69009bf496d86347b71a2b4cMathias Agopian                nb_loops += !nb_loops;   /* avoid division by zero */
57397c602c5af5f3ffd69009bf496d86347b71a2b4cMathias Agopian                averageTime = ((double)clockTime) / nb_loops / CLOCKS_PER_SEC;
57497c602c5af5f3ffd69009bf496d86347b71a2b4cMathias Agopian                if (averageTime < bestTime) bestTime = averageTime;
57597c602c5af5f3ffd69009bf496d86347b71a2b4cMathias Agopian                cSize=0; for (chunkNb=0; chunkNb<nbChunks; chunkNb++) cSize += chunkP[chunkNb].compressedSize;
57697c602c5af5f3ffd69009bf496d86347b71a2b4cMathias Agopian                ratio = (double)cSize/(double)benchedSize*100.;
57793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian                PROGRESS("%1i- %-28.28s :%9i ->%9i (%5.2f%%),%7.1f MB/s\r", loopNb, compressorName, (int)benchedSize, (int)cSize, ratio, (double)benchedSize / bestTime / 1000000);
57893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian            }
579d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian
580d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian            if (ratio<100.)
581d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian                DISPLAY("%2i-%-28.28s :%9i ->%9i (%5.2f%%),%7.1f MB/s\n", cAlgNb, compressorName, (int)benchedSize, (int)cSize, ratio, (double)benchedSize / bestTime / 1000000);
582d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian            else
583d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian                DISPLAY("%2i-%-28.28s :%9i ->%9i (%5.1f%%),%7.1f MB/s\n", cAlgNb, compressorName, (int)benchedSize, (int)cSize, ratio, (double)benchedSize / bestTime / 100000);
584b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian        }
585d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian
586d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian        /* Prepare layout for decompression */
587d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian        /* Init data chunks */
588d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian        { int i;
589d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian          size_t remaining = benchedSize;
590d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian          char* in = orig_buff;
591d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian          char* out = compressed_buff;
592b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian
593d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian          nbChunks = (int) (((int)benchedSize + (g_chunkSize-1))/ g_chunkSize);
594d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian          for (i=0; i<nbChunks; i++) {
595d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian              chunkP[i].id = i;
59697c602c5af5f3ffd69009bf496d86347b71a2b4cMathias Agopian              chunkP[i].origBuffer = in; in += g_chunkSize;
5973fbce7c56082e4e0d23f1c1c89983d3841853ed7Mathias Agopian              if ((int)remaining > g_chunkSize) { chunkP[i].origSize = g_chunkSize; remaining -= g_chunkSize; } else { chunkP[i].origSize = (int)remaining; remaining = 0; }
5989d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block              chunkP[i].compressedBuffer = out; out += maxCompressedChunkSize;
5993fbce7c56082e4e0d23f1c1c89983d3841853ed7Mathias Agopian              chunkP[i].compressedSize = 0;
6003fbce7c56082e4e0d23f1c1c89983d3841853ed7Mathias Agopian          }
6013fbce7c56082e4e0d23f1c1c89983d3841853ed7Mathias Agopian        }
6023fbce7c56082e4e0d23f1c1c89983d3841853ed7Mathias Agopian        for (chunkNb=0; chunkNb<nbChunks; chunkNb++) {
6033fbce7c56082e4e0d23f1c1c89983d3841853ed7Mathias Agopian            chunkP[chunkNb].compressedSize = LZ4_compress(chunkP[chunkNb].origBuffer, chunkP[chunkNb].compressedBuffer, chunkP[chunkNb].origSize);
60493ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian            if (chunkP[chunkNb].compressedSize==0) DISPLAY("ERROR ! %s() = 0 !! \n", "LZ4_compress"), exit(1);
605d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian        }
606e700501d0e888ead9ac6456c0a6fd74d634aa5fbMathias Agopian
607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        /* Decompression Algorithms */
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (dAlgNb=0; (dAlgNb <= NB_DECOMPRESSION_ALGORITHMS) && (g_decompressionTest); dAlgNb++) {
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const char* dName;
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int (*decompressionFunction)(const char*, char*, int, int);
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            double bestTime = 100000000.;
6121c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis
6131c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis            if ((g_decompressionAlgo != ALL_DECOMPRESSORS) && (g_decompressionAlgo != dAlgNb)) continue;
6144d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian
6154d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian            switch(dAlgNb)
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            {
6174d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian            case 0: DISPLAY("Decompression functions : \n"); continue;
6184d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian            case 1: decompressionFunction = local_LZ4_decompress_fast; dName = "LZ4_decompress_fast"; break;
6194d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian            case 3: decompressionFunction = local_LZ4_decompress_fast_usingDict; dName = "LZ4_decompress_fast_usingDict"; break;
6204d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian            case 4: decompressionFunction = LZ4_decompress_safe; dName = "LZ4_decompress_safe"; break;
6214d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian            case 6: decompressionFunction = local_LZ4_decompress_safe_usingDict; dName = "LZ4_decompress_safe_usingDict"; break;
6224d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian            case 7: decompressionFunction = local_LZ4_decompress_safe_partial; dName = "LZ4_decompress_safe_partial"; break;
6234d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian#ifndef LZ4_DLL_IMPORT
6244d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian			case 8: decompressionFunction = local_LZ4_decompress_safe_forceExtDict; dName = "LZ4_decompress_safe_forceExtDict"; break;
6254d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian#endif
6264d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian			case 9: decompressionFunction = local_LZ4F_decompress; dName = "LZ4F_decompress";
6274d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian                    errorCode = LZ4F_compressFrame(compressed_buff, compressedBuffSize, orig_buff, benchedSize, NULL);
6284d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian                    if (LZ4F_isError(errorCode)) {
6294d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian                        DISPLAY("Error while preparing compressed frame\n");
6304d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian                        free(orig_buff);
631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        free(compressed_buff);
632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        free(chunkP);
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        return 1;
6341b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian                    }
6351b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian                    chunkP[0].origSize = (int)benchedSize;
6361b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian                    chunkP[0].compressedSize = (int)errorCode;
6371b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian                    nbChunks = 1;
638a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                    break;
639a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            default :
6401b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian                continue;   /* skip if unknown ID */
6411b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            }
6421b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
6431b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            { size_t i; for (i=0; i<benchedSize; i++) orig_buff[i]=0; }     /* zeroing source area, for CRC checking */
644a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
6451b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            for (loopNb = 1; loopNb <= g_nbIterations; loopNb++) {
6461b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian                double averageTime;
6471b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian                clock_t clockTime;
648ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian                U32 crcDecoded;
64999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
650a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                PROGRESS("%1i- %-29.29s :%10i ->\r", loopNb, dName, (int)benchedSize);
65199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian
6521b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian                nb_loops = 0;
6531b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian                clockTime = clock();
654d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian                while(clock() == clockTime);
655a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                clockTime = clock();
656a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                while(BMK_GetClockSpan(clockTime) < TIMELOOP) {
657bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian                    for (chunkNb=0; chunkNb<nbChunks; chunkNb++) {
658d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian                        int decodedSize = decompressionFunction(chunkP[chunkNb].compressedBuffer, chunkP[chunkNb].origBuffer, chunkP[chunkNb].compressedSize, chunkP[chunkNb].origSize);
659d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian                        if (chunkP[chunkNb].origSize != decodedSize) DISPLAY("ERROR ! %s() == %i != %i !! \n", dName, decodedSize, chunkP[chunkNb].origSize), exit(1);
66082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                    }
66182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                    nb_loops++;
66282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                }
66382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                clockTime = BMK_GetClockSpan(clockTime);
66482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
66582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                nb_loops += !nb_loops;   /* Avoid division by zero */
66682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                averageTime = (double)clockTime / nb_loops / CLOCKS_PER_SEC;
66782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                if (averageTime < bestTime) bestTime = averageTime;
66882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
66982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                PROGRESS("%1i- %-29.29s :%10i -> %7.1f MB/s\r", loopNb, dName, (int)benchedSize, (double)benchedSize / bestTime / 1000000);
67082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
67182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                /* CRC Checking */
67282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                crcDecoded = XXH32(orig_buff, (int)benchedSize, 0);
67382d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian                if (crcOriginal!=crcDecoded) { DISPLAY("\n!!! WARNING !!! %14s : Invalid Checksum : %x != %x\n", inFileName, (unsigned)crcOriginal, (unsigned)crcDecoded); exit(1); }
67482d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian            }
67582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian
67682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian            DISPLAY("%2i-%-29.29s :%10i -> %7.1f MB/s\n", dAlgNb, dName, (int)benchedSize, (double)benchedSize / bestTime / 1000000);
67782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian        }
67882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian      }
67982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian      free(orig_buff);
68025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian      free(compressed_buff);
68125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian      free(chunkP);
68225e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian    }
68325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
68425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian    LZ4F_freeDecompressionContext(g_dCtx);
68525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian    if (g_pause) { printf("press enter...\n"); (void)getchar(); }
686a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
687b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian    return 0;
688a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
689a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
690a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
691a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianstatic int usage(const char* exename)
692b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian{
6933599bf2c0727bc33e8136f5163eee6f398545e05Jamie Gennis    DISPLAY( "Usage :\n");
694a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    DISPLAY( "      %s [arg] file1 file2 ... fileX\n", exename);
695b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian    DISPLAY( "Arguments :\n");
696b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian    DISPLAY( " -c     : compression tests only\n");
697a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian    DISPLAY( " -d     : decompression tests only\n");
698a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian    DISPLAY( " -H/-h  : Help (this text + advanced options)\n");
699a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian    return 0;
7008d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis}
701a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian
702a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopianstatic int usage_advanced(void)
703a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian{
704a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian    DISPLAY( "\nAdvanced options :\n");
705a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian    DISPLAY( " -c#    : test only compression function # [1-%i]\n", NB_COMPRESSION_ALGORITHMS);
706a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian    DISPLAY( " -d#    : test only decompression function # [1-%i]\n", NB_DECOMPRESSION_ALGORITHMS);
707a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian    DISPLAY( " -i#    : iteration loops [1-9](default : %i)\n", NBLOOPS);
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    DISPLAY( " -B#    : Block size [4-7](default : 7)\n");
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0;
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
712static int badusage(const char* exename)
713{
714    DISPLAY("Wrong parameters\n");
715    usage(exename);
716    return 0;
717}
718
719int main(int argc, const char** argv)
720{
721    int i,
722        filenamesStart=2;
723    const char* exename = argv[0];
724    const char* input_filename=0;
725
726    // Welcome message
727    DISPLAY(WELCOME_MESSAGE);
728
729    if (argc<2) { badusage(exename); return 1; }
730
731    for(i=1; i<argc; i++) {
732        const char* argument = argv[i];
733
734        if(!argument) continue;   // Protection if argument empty
735        if (!strcmp(argument, "--no-prompt")) {
736            g_noPrompt = 1;
737            continue;
738        }
739
740        // Decode command (note : aggregated commands are allowed)
741        if (argument[0]=='-') {
742            while (argument[1]!=0) {
743                argument ++;
744
745                switch(argument[0])
746                {
747                    // Select compression algorithm only
748                case 'c':
749                    g_decompressionTest = 0;
750                    while ((argument[1]>= '0') && (argument[1]<= '9')) {
751                        g_compressionAlgo *= 10;
752                        g_compressionAlgo += argument[1] - '0';
753                        argument++;
754                    }
755                    break;
756
757                    // Select decompression algorithm only
758                case 'd':
759                    g_compressionTest = 0;
760                    while ((argument[1]>= '0') && (argument[1]<= '9')) {
761                        g_decompressionAlgo *= 10;
762                        g_decompressionAlgo += argument[1] - '0';
763                        argument++;
764                    }
765                    break;
766
767                    // Display help on usage
768                case 'h' :
769                case 'H': usage(exename); usage_advanced(); return 0;
770
771                    // Modify Block Properties
772                case 'B':
773                    while (argument[1]!=0)
774                    switch(argument[1])
775                    {
776                    case '4':
777                    case '5':
778                    case '6':
779                    case '7':
780                    {   int B = argument[1] - '0';
781                        int S = 1 << (8 + 2*B);
782                        BMK_setBlocksize(S);
783                        argument++;
784                        break;
785                    }
786                    case 'D': argument++; break;
787                    default : goto _exit_blockProperties;
788                    }
789_exit_blockProperties:
790                    break;
791
792                    // Modify Nb Iterations
793                case 'i':
794                    if ((argument[1] >='0') && (argument[1] <='9')) {
795                        int iters = argument[1] - '0';
796                        BMK_setNbIterations(iters);
797                        argument++;
798                    }
799                    break;
800
801                    // Pause at the end (hidden option)
802                case 'p': BMK_setPause(); break;
803
804                    // Unknown command
805                default : badusage(exename); return 1;
806                }
807            }
808            continue;
809        }
810
811        // first provided filename is input
812        if (!input_filename) { input_filename=argument; filenamesStart=i; continue; }
813
814    }
815
816    // No input filename ==> Error
817    if(!input_filename) { badusage(exename); return 1; }
818
819    return fullSpeedBench(argv+filenamesStart, argc-filenamesStart);
820
821}
822