Files in the top-level directory in any check-in
- .project
- .settings
- doc
- src
- README
- Results.ods
- TODO
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