Yeah, everybody puts nonsense they consider important in a place that's hard to miss, though they know that readers are skilled in skipping them. I'll do the same. ****** About: ****** This is an application meant to easen benchmarking of in-memory data transformations. It started as a tool to simulate the way filesystems use compression, but its flexibility improved over time so much that testing other things works OK. Aside from compression algorithms it features ciphers and hashes and could be repurposed for nearly anything. ********* Features: ********* * multithreading * splitting data into blocks * testing in any level of cache or in RAM * overhead as low as 7 ticks/block on AMD64 and 11 on ARM ***************** How does it work: ***************** 1. It warms the CPU up with several iterations (-w) of memory shuffling. 2. If job_size (-j) is not defined, it tries to come up with a good one. 3. It splits the data into blocks (see -b switch). 4. It creates encoding threads (-t). 5. Each thread gets a number of blocks with a total size of at least job_size (-j). Note: Blocks are not split to smaller entities. When the entire file comes in just 1 block (which happens often with the defaults), it will be assigned to a single thread as a whole. The others won't get any work. 6. Encoding of each block is repeated overhead_iterations number of times (-o). This is meant to reduce the overhead introduced by the benchmark itself. It's needed only for testing data that fits in L1 cache with the fastest transforms. 7. Each thread encodes asigned blocks and asks for another job. Repeats until everything's compressed. If encoder is a compressor, block has to be reduced by it by at least sector_size of bytes (-m), otherwise it's left uncompressed. 8. Each thread decodes __encoded__ blocks. Please note that these may be different from different codecs. If one failed to encode some block (i.e. compress by at least sector_size), it doesn't get to decode it. Decoding speed takes into account only blocks that were encoded successfully. 9. Points 6 and 7 are repeated for at least small_iter_time ms. (-s), the runtimes are summed up. This is to compensate for clock inaccuracies. 10. Point 8 is repeated iters (-i) number of times, there's a minimum of runtimes taken. This is meant to reduce testing variability. ***************** In-cache testing: ***************** Testing in-cache is being performed by running encoder/decoder repeatadly on a piece of data that fits completely in your cache. To do so, you need to specify a *small enough* block (with -b switch) and a fair number of overhead iterations (-o). What is small enough? For ciphers / hashes, take slightly less than the size of your cache. For compressors - enough to contain both compressed and uncompressed data. **************** Included codecs: **************** Some codecs are in the default installation, some you have to enable with a compile-time option. See CMakeFiles.txt if you want them. Checksums: name | author | version | default? | source -------------------------------------------------------------------------------------------------------------------- Blake224 | multiple | SHA3 Final, 64bit opt | yes | Blake256 | multiple | SHA3 Final, 64bit opt | yes | Blake384 | multiple | SHA3 Final, 64bit opt | yes | Blake512 | multiple | SHA3 Final, 64bit opt | yes | Blake2b | multiple | 20130131 | yes | https://blake2.net Blake2bp | multiple | 20130131 | yes | https://blake2.net Blake2s | multiple | 20130131 | yes | https://blake2.net Blake2sp | multiple | 20130131 | yes | https://blake2.net BlueMidnightWish224 | Danilo Gligoroski | SHA3 rnd 2, 64bit opt | no | BlueMidnightWish256 | Danilo Gligoroski | SHA3 rnd 2, 64bit opt | no | BlueMidnightWish384 | Danilo Gligoroski | SHA3 rnd 1, 64bit opt | no | BlueMidnightWish512 | Danilo Gligoroski | SHA3 rnd 1, 64bit opt | no | CityHash32 | Geoff Pike, Jyrki Alakuijala | 1.1.0 | no | https://code.google.com/p/cityhash CityHash64 | Geoff Pike, Jyrki Alakuijala | 1.1.0 | no | https://code.google.com/p/cityhash CityHash128 | Geoff Pike, Jyrki Alakuijala | 1.1.0 | no | https://code.google.com/p/cityhash CrapWow | Andrew@Team5150.com | 2012-06-07 | no | www.team5150.com/~andrew/noncryptohashzoo crypto++ - adler32 | Wei Dai | 5.6.1 | no | www.cryptopp.com crypto++ - crc32 | Wei Dai | 5.6.1 | no | www.cryptopp.com crypto++ - md5 | Colin Plumb, Wei Dai | 5.6.1 | no | www.cryptopp.com crypto++ - sha224 | Steve Reid, Wei Dai | 5.6.1 | no | www.cryptopp.com crypto++ - sha256 | Steve Reid, Wei Dai | 5.6.1 | no | www.cryptopp.com crypto++ - sha384 | Steve Reid, Wei Dai | 5.6.1 | no | www.cryptopp.com crypto++ - sha512 | Steve Reid, Wei Dai | 5.6.1 | no | www.cryptopp.com CubeHash224 | Daniel J. Bernstein | SHA3 rnd 2, 64bit opt | no | CubeHash256 | Daniel J. Bernstein | SHA3 rnd 2, 64bit opt | no | CubeHash384 | Daniel J. Bernstein | SHA3 rnd 2, 64bit opt | no | CubeHash512 | Daniel J. Bernstein | SHA3 rnd 2, 64bit opt | no | Edon-R224 | multiple | v20 | no | www.item.ntnu.no/people/personalpages/fac/danilog/edon-r Edon-R256 | multiple | v20 | no | www.item.ntnu.no/people/personalpages/fac/danilog/edon-r Edon-R384 | multiple | v20 | no | www.item.ntnu.no/people/personalpages/fac/danilog/edon-r Edon-R512 | multiple | v20 | no | www.item.ntnu.no/people/personalpages/fac/danilog/edon-r FarmHash32 | ? | SVN r4 | yes | https://code.google.com/p/farmhash FarmHash64 | ? | SVN r4 | yes | https://code.google.com/p/farmhash FarmHash128 | ? | SVN r4 | yes | https://code.google.com/p/farmhash fletcher2 | ?? (used in ZFS) | 2010 | no | fletcher4 | ?? (used in ZFS) | 2010 | no | FNV1a-Jesteress | Georgi Marinov | 2012-06-09 | yes | www.sanmayce.com/Fastest_Hash/index.html FNV1a-Mantis | Georgi Marinov | 2012-06-09 | yes | www.sanmayce.com/Fastest_Hash/index.html FNV1a-Meiyan | Georgi Marinov | 2012-06-09 | yes | www.sanmayce.com/Fastest_Hash/index.html FNV1a-Penumbra | Georgi Marinov | 2013-06-16 | yes | www.sanmayce.com/Fastest_Hash/index.html FNV1a-Tesla | Georgi Marinov | v2 | yes | www.sanmayce.com/Fastest_Hash/index.html FNV1a-Tesla3 | Georgi Marinov | 2013-03-13 | yes | www.sanmayce.com/Fastest_Hash/index.html FNV1a-Yorikke | Georgi Marinov | 2013-05-12 | yes | www.sanmayce.com/Fastest_Hash/index.html FNV1a-YoshitsuTRIAD | Georgi Marinov | 2013-05-12 | yes | www.sanmayce.com/Fastest_Hash/index.html FNV1a-YoshimitsuTRIADiiXMM | Georgi Marinov | 2013-05-12 | yes | www.sanmayce.com/Fastest_Hash/index.html FNV1a-Yoshimura | Georgi Marinov | 2013-03-13 | yes | www.sanmayce.com/Fastest_Hash/index.html Grøstl224 | Soeren S. Thomsen, Krystian Matusiewicz | SHA3 Final, 64bit opt | yes | Grøstl256 | Soeren S. Thomsen, Krystian Matusiewicz | SHA3 Final, 64bit opt | yes | Grøstl384 | Soeren S. Thomsen, Krystian Matusiewicz | SHA3 Final, 64bit opt | yes | Grøstl512 | Soeren S. Thomsen, Krystian Matusiewicz | SHA3 Final, 64bit opt | yes | JH224 | Hongjun Wu | SHA3 Final, 64bit opt | yes | JH256 | Hongjun Wu | SHA3 Final, 64bit opt | yes | JH384 | Hongjun Wu | SHA3 Final, 64bit opt | yes | JH512 | Hongjun Wu | SHA3 Final, 64bit opt | yes | Keccak224 | multiple | SHA3 Final, 64bit opt | yes | Keccak256 | multiple | SHA3 Final, 64bit opt | yes | Keccak384 | multiple | SHA3 Final, 64bit opt | yes | Keccak512 | multiple | SHA3 Final, 64bit opt | yes | murmur3_x86_32 | Austin Appleby | 2012-02-29 | yes | murmur3_x86_128 | Austin Appleby | 2012-02-29 | yes | murmur3_x64_128 | Austin Appleby | 2012-02-29 | yes | SipHash | Jean-Philippe Aumasson, Daniel J. Bernstein | reference | yes | https://131002.net/siphash Skein224 | Doug Whiting | SHA3 Final, 64bit opt | yes | Skein256 | Doug Whiting | SHA3 Final, 64bit opt | yes | Skein384 | Doug Whiting | SHA3 Final, 64bit opt | yes | Skein512 | Doug Whiting | SHA3 Final, 64bit opt | yes | Skein1024 | Doug Whiting | SHA3 Final, 64bit opt | yes | SpookyHash | Bob Jenkins | V2 2012-08-05 | yes | http://burtleburtle.net/bob/hash/spooky.html SWIFFTX224 | multiple | SHA3 rnd 1, 64bit opt | no | SWIFFTX256 | multiple | SHA3 rnd 1, 64bit opt | no | SWIFFTX384 | multiple | SHA3 rnd 1, 64bit opt | no | SWIFFTX512 | multiple | SHA3 rnd 1, 64bit opt | no | uhash | Ted Krovetz | 2007-04-17 | yes | www.fastcrypto.com vhash | Ted Krovetz, Wei Dai | 2007-04-17 | yes | www.fastcrypto.com umac | Ted Krovetz | 2007-04-17 | yes | www.fastcrypto.com vmac | Ted Krovetz, Wei Dai | 2007-04-17 | yes | www.fastcrypto.com xxhash | Yann Collet | r39 | yes | https://code.google.com/p/xxhash xxhash64 | Yann Collet | r39 | yes | https://code.google.com/p/xxhash Ciphers: name | author | version | default? | ------------------------------------------------------------------------------------------------------- AES128 | Daniel J. Bernstein | little-4 | yes | AES256 | Hongjun Wu | v1 | yes | ChaCha | Daniel J. Bernstein | 20080118 | yes | HC-128 | ?? | 2007-01b | yes | HC-256 | ?? | 2007-01 | yes | LEX | Alex Biryukov | v2 | yes | Rabbit | ?? | opt2 | yes | RC4 | Christophe De Cannière | 2005-08-21 | yes | Salsa20/8 | Daniel J. Bernstein | merged | yes | Salsa20/12 | Daniel J. Bernstein | merged | yes | Salsa20 | Daniel J. Bernstein | merged | yes | Snow 2.0 | Patrik Ekdahl and Thomas Johansson | fast | yes | Sosemanuk | Thomas Pornin | 2005-04-26 | yes | Trivium | Christophe De Cannière | 2006-02-23 | yes | Compressors: name | author | version | default? | source -------------------------------------------------------------------------------------------------------------------------------- 7z - deflate | Igor Pavlov | 9.20 | yes | http://7-zip.org 7z - deflate64 | Igor Pavlov | 9.20 | yes | http://7-zip.org ar | Haruhiko Okumura, Kerwin F. Medina, SanguineRose | 2013-06-03 | no | https://github.com/Sanguinarious/lzh-improved Basic Compression Library - huffman | Marcus Geelnard | 1.2.0 | no | http://bcl.comli.eu Basic Compression Library - lz | Marcus Geelnard | 1.2.0 | no | http://bcl.comli.eu Basic Compression Library - lzfast | Marcus Geelnard | 1.2.0 | no | http://bcl.comli.eu Basic Compression Library - rle | Marcus Geelnard | 1.2.0 | no | http://bcl.comli.eu blosc | Francesc Alted | 1.5.2 | no | http://blosc.pytables.org/trac BriefLZ | Joergen Ibsen | 1.0.5 | no | http://ibsensoftware.com/download.html Brotli | Jyrki Alakuijala, Zoltan Szabadka | 2015-02-01 | no | https://github.com/google/brotli bzip2 | Julian Seward | 1.0.6 | yes | http://bzip.org crush | Ilia Muraviev | 0.0.1 | yes | http://encode.ru/threads/1289-CRUSH-0-01-is-here! crypto++ - deflate | Wei Dai | 5.6.1 | yes | www.cryptopp.com Density | Guillaume Voirin | 0.12.0 beta | yes | https://github.com/centaurean/density Doboz | Attila T. Áfra | 2011-03-19 | no | https://bitbucket.org/attila_afra/doboz/downloads FastLZ | Ariya Hidayat | 0.1.0 | no | http://fastlz.org FSE | Yann Collet | 2014-04-07 | no | https://github.com/Cyan4973/FiniteStateEntropy gipfeli | Rasto Lenhardt, Jyrki Alakuijala | 2014-06-27 | no | https://github.com/google/gipfeli Halibut - deflate | Simon Tatham | SVN r9550 | no | http://www.chiark.greenend.org.uk/~sgtatham/halibut lodepng - deflate | Lode Vandevenne | 20120729 | no | http://lodev.org/lodepng lrrle | m^2 | 0 | yes | LZ4 | Yann Collet | r127 | yes | https://code.google.com/p/lz4 LZ4hc | Yann Collet | r127 | yes | https://code.google.com/p/lz4 LZF | Marc Alexander Lehmann | 3.6 | yes | http://oldhome.schmorp.de/marc/liblzf.html LZFX | Andrew Collette | r16 | no | https://code.google.com/p/lzfx LZG | Marcus Geelnard | 1.0.6 | no | http://liblzg.bitsnbites.eu LZHAM | Richard Geldreich, Jr. | 2015-01-31 | no | https://github.com/richgel999/lzham_codec LZJB | Jeff Bonwick | FreeBSD r263244 | no | mmini - lzl | Adam Ierymenko | 2010 | no | https://code.google.com/p/mmini LZMAT | Vitaly Evseenko | 1.1 | yes | www.matcode.com/lzmat.htm LZO | Markus Franz Xaver Johannes Oberhumer | 2.08 | yes | www.oberhumer.com/opensource/lzo LZP_ds | Dmitry Shkarin | v0 | no | http://www.ctxmodel.net/files/LZP-DS_v0.rar LZSS | Ilia Muraviev | 2008-07-31 | no | http://encode.ru/threads/143-LZSS-v0-01-is-here! LZSS | Nobuo Ito | 1.0 | no | LZV1 | Hermann Vogt | 0.5 | no | http://encode.ru/threads/1661-LZWC-A-fast-tree-based-LZW-compressor lzx_compress | Matthew T. Russotto | 2005-07-06 | no | http://www.russotto.net/chm/ miniz | Richard Geldreich, Jr. | 1.11 | yes | https://code.google.com/p/miniz Nakamichi | Georgi Marinov | Aratama | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Butsuhira | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | ButsuhiraBranchless | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Daikuni | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Hanabi | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Hanazakari | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Hitomi | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Inazuma | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Jiten | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Kaibutsu | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Kaidanji FIX | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Kaiko | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Kinezumi | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Kinroba | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Kinutora | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Kitsune | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Kumataka | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Nekomata | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Nin | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Nirenpatsu | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Sanagi | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Sanbashi | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Sanrenpatsu | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Sanshi | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Suiken | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Tengu | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Washi | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Yoko | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | Georgi Marinov | Zangetsu | yes | http://www.sanmayce.com/Nakamichi/ Nakamichi | m^2, Georgi Marinov | M2.0 | yes | nrv2a | Markus Franz Xaver Johannes Oberhumer | 1.03 | no | www.oberhumer.com/opensource/ucl nrv2b | Markus Franz Xaver Johannes Oberhumer | 1.03 | no | www.oberhumer.com/opensource/ucl nrv2d | Markus Franz Xaver Johannes Oberhumer | 1.03 | no | www.oberhumer.com/opensource/ucl PostreSQL | Jan Wieck | 9.3.4 | no | http://www.postgresql.org/ QuickLZ | Lasse Mikkel Reinhold | 1.5.1b6 | yes | www.quicklz.com QuickLZ zip | Lasse Mikkel Reinhold | 0.4 | no | www.quicklz.com/zip.html RLE64 | Javier Gutiérrez Chamorro | R3.00 | no | http://nikkhokkho.sourceforge.net/static.php?page=RLE64 SCZ | Carl Kindman | 2008-11-25 | no | Shrinker | Fu Siyuan | r5 | yes | https://code.google.com/p/shrinker Snappy | ??? | 1.1.0 | yes | https://code.google.com/p/snappy tinf | Joergen Ibsen | 1.00 | no | http://ibsensoftware.com/download.html Tornado | Joachim Henke, Bulat Ziganshin | 0.6a | yes | http://freearc.org:8002 wfLZ | Shane Calimlim | r10 | yes | https://code.google.com/p/wflz/ Yappy | Peter Popov | v2 | yes | http://blog.gamedeff.com/?p=371 z3lib - deflate | Oskar Schirmer | 1.3 | no | http://scara.com/~schirmer/o/z3lib zlib - deflate | Mark Adler, Jean-loup Gailly | 1.2.8 | yes | http://zlib.net zlib - deflate, Intel version | Mark Adler, Jean-loup Gailly, Jim Kukunas | 2014-06-16 | no | https://github.com/jtkukunas/zlib zling | Zhang Li | 20140324 | yes | https://github.com/richox/libzling zopfli - deflate | Lode Vandevenne, Jyrki Alakuijala | 1.0.0 | yes | https://code.google.com/p/zopfli zstd | Yann Collet | 2015-01-31 | yes | https://github.com/Cyan4973/zstd ************************* Notes on included codecs: ************************* * many of them contain minor modifications to make them work with FsBench. I will only list the important ones. * In Yappy I added an option not to use SSE2 to improve portability. * In some cases I changed int types used when I encountered or expected portability problems. Should work exactly the same on intended platforms and also work on some more. * In BriefLZ the porting had to adjust some constants, which assumed 32-bit pointers. Also, because pointers are twice as big on 64-bit systems, effective memory capacity is halved, which reduces strength somewhat. * LZHAM uses 128 KB dictionary. It can be changed in sources. I intend to make it configurable from the command line later. * In lzx_compress I use a non-sliding window and lazy matching. Weirdly, the lzx_compress front-end doesn't use the sliding window version correctly. * I use BlueMidnightWish512 and 384 from the 1st instead of 2nd round of SHA3 competition because the latter doesn't work correctly on my system. It seems to be doing some out of bounds memory accesses. * z3lib asks for a number of compression parameters, documents allowed ranges, but not sensible defaults. I used all 0s, is it fine? I haven't wasted an evening to figure out. ************************* Notes on rejected codecs: ************************* * there were several codecs that I rejected because of their focus on education and goals of clarity over efficiency. I guess that most of them are not woth my time because benchmarka are all about efficiency. * codecs that are not FOSS, are not written in C(++) or are not written in English not to complicate things for myself. (Note: may introduce them later) * LZRW* - really, just historic codecs, very poor nowadays. Note: at the time of rejections fsbench has been much less maintainable than it is now. I may reintroduce LZRW* if convinced that it's useful. * snappy-c - I would really like to use it, but it's dependence on Linux kernel headers scares me off. Note: it's been said that the depencence has been removed. TOCHECK. * arjz - Looks like the code is only single threaded and would take considerable effort to make usable. * UC2 - Looks like the code is only single threaded and would take considerable effort to make usable. * lha - Unix only * ulha - Unix only * arj - x86 only * NTFS-3G - I tried, but got crashes. Took too much time to debug, I gave up. I may retry later. * LZP1 - Initially looked OK, but crashed sometimes. And it wasn't good anyway. * LZP2 - Kept crashing when compiled with mingw (both x86 and AMD64), so I didn't even try to integrate it with fsbench. * flzp - My initial tests showed that it was weak and slow. I guess that's because it has been designed to be used as a preprocessor... * zax - It seemed very immature. * I got crashes with 7zip's PPMD. The code base is terribly complicated and I decided that it's better to stay away than to debug * minihuff - requires one to have ready frequency statistics ************ Other notes: ************ * Some algorithms contain asm pieces. I never use them because that would be a big complication for me. ************ Known bugs: ************ * chaining codecs doesn't always work, schemes that involve compressor+compressor, compressor+encryption are broken