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