<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
        <title>The Garbage Pile</title>
        <description>The Garbage Pile - Conor Stokes</description>
        <link>http://ConorStokes.github.io</link>
        <lastBuildDate>2022-11-10T01:15:48+00:00</lastBuildDate>
        <pubDate>2022-11-10T01:15:48+00:00</pubDate>
        <ttl>1800</ttl>


        <item>
                <title>Sloppy Codes, Extra Sloppy</title>
                <description>
&lt;p&gt;Between the Marlin paper coming out and a contract I’m currently working on, I started thinking about compression again a bit more recently. Friday night, I had an idea (it was quite a bad idea) about using a 16 entry Tunstall dictionary for binary alphabet entropy coding (with variable length output up to 8 bits in length) and using a byte shuffle to lookup the codes from a register in parallel when decoding, throwing in an adaption step.&lt;/p&gt;

&lt;p&gt;My initial thought was that maybe it would be a good way to get a cheap compression win for encoding if the next input was a match or a literal in a fast LZ (and using a count trailing bits to count runs of multiple literals). I started to dismiss the idea as particularly useful by Saturday morning, thinking it was the product of too much Friday night cheese and craft beer after thinking about compression all week. However (quite quixotically), I decided to implement it anyway (standalone), because I had some neat ideas for the decoding implementation in particular that I wanted to try out. The implementation turned out quite interesting and I thought it would be neat to share the techniques involved. I also think it’s good to explore bad technical ideas sometimes in case you are surprised or discover something new, and to talk about the things that don’t work out.&lt;/p&gt;

&lt;p&gt;As predicted, it ended up being fast (for an adaptive binary entropy coder), but quite terrible at getting much of a compression win. I call the results “Sloppy Coding” (sloppy codes, extra sloppy) and the repository is available &lt;a href=&quot;https://github.com/ConorStokes/Sloppy-Coding&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Firstly, I wrote a small Tunstall dictionary generator for binary alphabets that generated 16 entry dictionaries for 64 different probabilities and outputted tables for encoding/decoding as C/C++ code, so the tables can be shipped with the code and compiled inline. Each dictionary contains the binary output codes, the length of the codes, an extraction mask for each code and the probability of a bit being on or off in each node. This totals at 64 bytes (one cache line) for an entire dictionary (or 4K for all the dictionaries).&lt;/p&gt;

&lt;p&gt;The encoded format itself packs 32 nibble words (dictionary references) into a 16 byte control word. First the low nibbles, then the high nibbles for the word are populated.&lt;/p&gt;

&lt;p&gt;At decode time, we load the control word as well as the dictionary into a SSE registers, then split out the low nibbles:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i dictionary     = _mm_loadu_si128( reinterpret_cast&amp;lt; const __m128i* &amp;gt;( decodingTable ) + dictionaryIndex * 4 );
__m128i extract        = _mm_loadu_si128( reinterpret_cast&amp;lt; const __m128i* &amp;gt;( decodingTable ) + dictionaryIndex * 4 + 1 );
__m128i counts         = _mm_loadu_si128( reinterpret_cast&amp;lt; const __m128i* &amp;gt;( decodingTable ) + dictionaryIndex * 4 + 2 );

__m128i  nibbles       = _mm_loadu_si128( reinterpret_cast&amp;lt; const __m128i* &amp;gt;( compressed ) );

__m128i  loNibbles     = _mm_and_si128( nibbles, nibbleMask ); 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then we use PSHUFB to look up the dictionary values, bit lengths and extraction masks. We do a quick horizontal add with PSADBW to sum up the bit-lengths (we do the same for the high nibbles after):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i  symbols   = _mm_shuffle_epi8( dictionary, loNibbles );
__m128i  mask      = _mm_shuffle_epi8( extract, loNibbles );
__m128i  count     = _mm_shuffle_epi8( counts, loNibbles );
__m128i  sumCounts = _mm_sad_epu8( count, zero );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then there’s an extraction and output macro that extracts a 64 bit word from the symbols, masks, sums and counts, uses PEXT to get rid of the empty spaces between the values coming from the dictionary (this macro is used four times, twice each for the high and low nibbles). After that, it branchlessly outputs the compacted bits. We have at least 16 bits and at most 64 bits extracted at a time (and at most 7 bits left in the bit buffer). Note when repopulating the bit buffer at the end we have a small work around in case we end up with a shift right by 64 (that’s the first line of the last statement). The branch-less bit output, as well as the combination of PSHUFB and PEXT are some of the more interesting parts here (and a big part of what I wanted to try out).  Similar code could be used to output Huffman codes for a small alphabet:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;uint64_t symbolsExtract  = 
	static_cast&amp;lt; uint64_t &amp;gt;( _mm_extract_epi64( symbols, extractIndex ) );
uint64_t maskExtract     = 
	static_cast&amp;lt; uint64_t &amp;gt;( _mm_extract_epi64( mask, extractIndex ) );
uint64_t countExtract    = 
	static_cast&amp;lt; uint64_t &amp;gt;( _mm_extract_epi64( sumCounts, extractIndex ) );

uint64_t compacted  = _pext_u64( symbolsExtract, maskExtract );
                                                       
bitBuffer |= ( compacted &amp;lt;&amp;lt; ( decompressedBits &amp;amp; 7 ) );

*reinterpret_cast&amp;lt; uint64_t* &amp;gt;( outBuffer + ( decompressedBits &amp;gt;&amp;gt; 3 ) ) = bitBuffer;                               

decompressedBits += countExtract;                                                                                 

bitBuffer = ( -( ( decompressedBits &amp;amp; 7 ) != 0 ) ) &amp;amp; 
            ( compacted &amp;gt;&amp;gt; ( countExtract - ( decompressedBits &amp;amp; 7 ) ) );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After we’ve done all this for the high and low nibbles/high and low words, we adapt and choose a new dictionary. We do this by adding together all the probabilities (which are in the range 0 to 255), summing them together and dividing by 128 (no fancy rounding):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    __m128i probabilities = _mm_loadu_si128( reinterpret_cast&amp;lt; const __m128i* &amp;gt;( decodingTable ) + dictionaryIndex * 4 + 3 );
    __m128i loProbs       = _mm_shuffle_epi8( probabilities, loNibbles );
    __m128i sumLoProbs    = _mm_sad_epu8( loProbs, zero );
    __m128i hiProbs       = _mm_shuffle_epi8( probabilities, hiNibbles );
    __m128i sumHiProbs    = _mm_sad_epu8( hiProbs, zero );
    __m128i sumProbs      = _mm_add_epi32( sumHiProbs, sumLoProbs );

    dictionaryIndex = ( _mm_extract_epi32( sumProbs, 0 ) + _mm_extract_epi32( sumProbs, 2 ) ) &amp;gt;&amp;gt; 7;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Currently in the code there is no special handling at end of buffer (I just assume that there is extra space at the end of the buffer) because this is more of a (dis)proof of concept than anything else. The last up-to 7 bits in the bit buffer are flushed at the end.&lt;/p&gt;

&lt;p&gt;The reason the decoder implementation is interesting to me is largely because of just how many of the operations can be done in parallel. We can look-up 16 dictionary codes at a time with PSHUFB and then pack the output of 8 of those looked up codes into a single 64bit word in two operations (an extract and a PEXT), which would usually take quite a lot of bit fiddling. The branchless output of that word to the output buffer is also nice, although it relies on some properties of the codes to work (mainly that there will always be more than 8 bits output, so we never have any of the previous bit buffer to worry about). Really, it feels like there is a lot of economy of motion here and the instructions fit together very neatly to do the job.&lt;/p&gt;

&lt;p&gt;The one part that feels out of place to me though is having to work around there being a possible variable shift right by 64 bits when we store the residual in the bit buffer that wasn’t put in the output buffer. It would be nice if this wasn’t undefined behaviour (and processors implemented it the right way), but we can’t always get what we want.&lt;/p&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;
&lt;p&gt;For testing, I generated 128 megabytes of randomly set bits (multiple times, according to various probability distributions), as well as a one that used a sine wave to vary the probability distribution (to make sure that it was adapting). Compression and decompression speed are in megabytes (the old fashioned 1024&lt;sup&gt;2&lt;/sup&gt; variety) averaged over 15 runs. Bench-marking machine is my usual Haswell i7 4790.&lt;/p&gt;

&lt;p&gt;The compression ratio for the outlying probabilities (0 to 1) achieves at or very close to the theoretical optimum capable of the coder (which is fairly far from entropy) and the middle most probabilities are not too far away from achieving entropy (even if they slightly gain information). But the ratios just outside the middle don’t drop quite fast enough for any savings in most scenarios and stay stubbornly high. A much larger dictionary, with longer maximum output codes, would offer considerably more savings at the cost of losing our neat implementation tricks and performant adaption (but Tunstall coding is already a fairly known quantity). There’s also the matter of how imprecise our probability model is and compared to most other adaptive coders, we don’t adapt per symbol.&lt;/p&gt;

&lt;p&gt;Speedwise, (remembering that our actual output symbols are bits), for decompression we’re far faster than an adaptive binary arithmetic coder is capable of, given we’re outputting multiple bits per cycle (where as a binary arithmetic coder is going to take multiple cycles for a single bit). But that’s not saying much, given how relatively far we are away from entropy (where a binary arithmetic closer gets as close as its precision will allow).&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Probability &lt;/th&gt;
      &lt;th&gt;Compression Speed &lt;/th&gt;
      &lt;th&gt;Encoded Size&lt;/th&gt;
      &lt;th&gt;Ratio  &lt;/th&gt;
      &lt;th&gt;  Decompression Speed &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;206.230639&lt;/td&gt;
      &lt;td&gt;67114272&lt;/td&gt;
      &lt;td&gt;  0.50004&lt;/td&gt;
      &lt;td&gt;  2158.874927&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.066667&lt;/td&gt;
      &lt;td&gt;175.3852&lt;/td&gt;
      &lt;td&gt;79162256&lt;/td&gt;
      &lt;td&gt;  0.589805&lt;/td&gt;
      &lt;td&gt;  1831.462974&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.133333&lt;/td&gt;
      &lt;td&gt;151.631986&lt;/td&gt;
      &lt;td&gt;91572032&lt;/td&gt;
      &lt;td&gt;  0.682265&lt;/td&gt;
      &lt;td&gt;  1586.54503&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.2&lt;/td&gt;
      &lt;td&gt;132.081896&lt;/td&gt;
      &lt;td&gt;104868416&lt;/td&gt;
      &lt;td&gt;  0.781331&lt;/td&gt;
      &lt;td&gt;  1377.348473&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.266667&lt;/td&gt;
      &lt;td&gt;117.898678&lt;/td&gt;
      &lt;td&gt;117748768&lt;/td&gt;
      &lt;td&gt;  0.877297&lt;/td&gt;
      &lt;td&gt;  1236.169277&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.333333&lt;/td&gt;
      &lt;td&gt;108.803616&lt;/td&gt;
      &lt;td&gt;127463824&lt;/td&gt;
      &lt;td&gt;  0.949679&lt;/td&gt;
      &lt;td&gt;  1141.881051&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.4&lt;/td&gt;
      &lt;td&gt;104.331363&lt;/td&gt;
      &lt;td&gt;133059200&lt;/td&gt;
      &lt;td&gt;  0.991368&lt;/td&gt;
      &lt;td&gt;  1084.070366&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.466667&lt;/td&gt;
      &lt;td&gt;102.554293&lt;/td&gt;
      &lt;td&gt;134885904&lt;/td&gt;
      &lt;td&gt;  1.004978&lt;/td&gt;
      &lt;td&gt;  1057.176446&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.533333&lt;/td&gt;
      &lt;td&gt;102.718932&lt;/td&gt;
      &lt;td&gt;134931136&lt;/td&gt;
      &lt;td&gt;  1.005315&lt;/td&gt;
      &lt;td&gt;  1066.073632&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.6&lt;/td&gt;
      &lt;td&gt;104.353041&lt;/td&gt;
      &lt;td&gt;133057584&lt;/td&gt;
      &lt;td&gt;  0.991356&lt;/td&gt;
      &lt;td&gt;  1092.383074&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.666667&lt;/td&gt;
      &lt;td&gt;108.918791&lt;/td&gt;
      &lt;td&gt;127351120&lt;/td&gt;
      &lt;td&gt;  0.94884&lt;/td&gt;
      &lt;td&gt;  1143.198439&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.733333&lt;/td&gt;
      &lt;td&gt;118.245568&lt;/td&gt;
      &lt;td&gt;117570320&lt;/td&gt;
      &lt;td&gt;  0.875967&lt;/td&gt;
      &lt;td&gt;  1226.966374&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.8&lt;/td&gt;
      &lt;td&gt;132.864274&lt;/td&gt;
      &lt;td&gt;104712784&lt;/td&gt;
      &lt;td&gt;  0.780171&lt;/td&gt;
      &lt;td&gt;  1389.678224&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.866667&lt;/td&gt;
      &lt;td&gt;151.684972&lt;/td&gt;
      &lt;td&gt;91559024&lt;/td&gt;
      &lt;td&gt;  0.682168&lt;/td&gt;
      &lt;td&gt;  1585.006786&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;0.933333&lt;/td&gt;
      &lt;td&gt;174.659716&lt;/td&gt;
      &lt;td&gt;79162864&lt;/td&gt;
      &lt;td&gt;  0.589809&lt;/td&gt;
      &lt;td&gt;  1830.458242&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;1&lt;/td&gt;
      &lt;td&gt;205.484085&lt;/td&gt;
      &lt;td&gt;67108880&lt;/td&gt;
      &lt;td&gt;  0.5&lt;/td&gt;
      &lt;td&gt;  2162.718762&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Sine Wave&lt;/td&gt;
      &lt;td&gt;140.850482&lt;/td&gt;
      &lt;td&gt;98377072&lt;/td&gt;
      &lt;td&gt;  0.732966&lt;/td&gt;
      &lt;td&gt;  1461.307419&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
                <link>http://ConorStokes.github.io/compression/2017/04/24/sloppy-codes-extra-sloppy</link>
                <guid>http://ConorStokes.github.io/compression/2017/04/24/sloppy-codes-extra-sloppy</guid>
                <pubDate>2017-04-24T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>Boondoggle, the VR Music Visualizer</title>
                <description>
&lt;p&gt;When I got my Oculus in June, one of the things that struck me was that the experiences that I enjoyed most were those where you could relax and just enjoy being somewhere else. It reminded me a lot of one of my favourite ways of relaxing; putting on headphones and losing myself in some music. I’d also been looking at &lt;a href=&quot;https://www.shadertoy.com/&quot;&gt;shadertoy&lt;/a&gt; and many cool demos coming through on my twitter feed and wanted to have a bit of a try of some of the neat ray marching techniques.&lt;/p&gt;

&lt;p&gt;So the basic idea that followed from this was to create a music visualization framework that could capture audio currently playing on the desktop (as to work with any music player that wasn’t running a DRM stream), do a bit of signal processing on it and then output pretty ray marched visuals on the HMD.&lt;/p&gt;

&lt;p&gt;Here’s a capture of a visualizer effect running in a Window:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/nSGt-b3IKPM&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;br /&gt;
And here’s one in the HMD rendering view:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/RNpDMeUymUY&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;This post basically goes through how I went about that, as well as the ins and outs of one visualizer effect I’m pretty happy with. I should be clear though, this is a work in progress and a spare time project that has often been left for weeks at a time (and it’s in a definite state of flux). The current source is on &lt;a href=&quot;https://github.com/ConorStokes/boondoggle&quot;&gt;github&lt;/a&gt; and will be updated sporadically as I experiment. There is also a &lt;a href=&quot;https://github.com/ConorStokes/boondoggle/releases/tag/blog-version&quot;&gt;binary release&lt;/a&gt;. There is a lot to be covered here, so in some sections I will be glossing over things (feel free to email me, leave a comment or contact me on twitter if there is any detail you would like clarified).&lt;/p&gt;

&lt;h2 id=&quot;basic-architecture&quot;&gt;Basic Architecture&lt;/h2&gt;
&lt;p&gt;The visualizer framework has two main components; the visualizer run-time itself, and a compiler that takes a JSON file that references a bundle a bunch of HLSL shaders and textures and turns them into visualizer effects package used by the run-time. The compiler turn around time is pretty quick, so you can see effects changes quite quickly (iteration time isn’t quite shadertoy good, but still pretty reasonable). The targeted platforms are Windows, D3D 11, and the Oculus SDK (if you don’t have the Oculus runtime installed or a HMD connected, it will render into a window, but the target is definitely a HMD; the future plan is to add OpenVR SDK support too).&lt;/p&gt;

&lt;p&gt;I used Branimir Karadzic’s &lt;a href=&quot;https://github.com/bkaradzic/GENie&quot;&gt;GENie&lt;/a&gt; to generate Visual Studio projects (currently the only target I support), because it was a bit easier than building and maintaining the projects by hand. Apart from the Oculus SDK and platform dependencies, all external code has been copied into the repository and is compiled directly as part of the build. Microsoft’s DDS loader from &lt;a href=&quot;https://github.com/Microsoft/DirectXTex&quot;&gt;DirectXTex&lt;/a&gt; is used to load textures, &lt;a href=&quot;https://github.com/itdaniher/kissfft&quot;&gt;KISS FFT&lt;/a&gt; is used for signal processing and JSON is parsed with Neil Henning’s &lt;a href=&quot;https://github.com/sheredom/json.h&quot;&gt;json.h&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Originally I was going to capture and process the audio on a separate thread, but given how light the CPU requirements for the audio capturing/processing are and that we aren’t spending much CPU time on anything else, everything ended up done on a single thread, with the audio being polled every frame.&lt;/p&gt;

&lt;h2 id=&quot;handling-the-audio&quot;&gt;Handling the Audio&lt;/h2&gt;
&lt;p&gt;Capturing audio from the desktop on Windows is interesting. The capture itself is done using WASAPI with a loop-back capture client running on the default device. This pretty much allows us to capture whatever is rendering on a device that isn’t exclusive or DRM’d (and we make sure the data is coerced to floating point if it isn’t already).&lt;/p&gt;

&lt;p&gt;One of the caveats to this is that capture doesn’t work when nothing is playing on the device, so we also create a non-exclusive render device and play silence on it at the same time.&lt;/p&gt;

&lt;p&gt;Every frame we poll to A) play silence on the device if there is room in the playback buffer and B) capture any sound data packets currently to be played to the device by copying them into a circular buffer per channel (we do this as we only copy out the first two channels of the audio in case the device is actually surround sound, mono is handled by duplication). This works very well as long as you maintain a high enough frame-rate to capture every packet coming out of the device; the case where a packet is missed is handled by starting from scratch in the circular buffer.&lt;/p&gt;

&lt;p&gt;Audio processing is tied to the first power-of-two number of samples that allow us to capture our minimum frequency for processing (50hz). The circular buffer is twice this size and instead of using the head of the buffer to do the audio processing every frame, we use either the low or high halves of the circular buffer whenever they are full.&lt;/p&gt;

&lt;p&gt;When we capture one of those roughly-50hz shaped blocks, we do a number of processing steps to get the data ready to pass off to the shaders:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Calculate the &lt;a href=&quot;https://en.wikipedia.org/wiki/Root_mean_square&quot;&gt;RMS&lt;/a&gt; on all the samples in the block per channel to get an estimate of how loud that channel is. Also a logarithmic version of this cut off at a noise floor to get a more human friendly measure. These values are smoothed using an exponential moving average to make them more visually appealing in the shaders.&lt;/li&gt;
  &lt;li&gt;Run a Windowing function (&lt;a href=&quot;https://en.wikipedia.org/wiki/Hann_function&quot;&gt;Hanning&lt;/a&gt;, but this can be changed to any other Generalized Hamming Window relatively easily) prior to the FFT to take out any spurious frequency data that would come from using a finite/non-wrapping FFT window. Note, we don’t do overlapping FFT windows as this works fine for visualization purposes.&lt;/li&gt;
  &lt;li&gt;Run a real FFT per channel using KISS FFT.&lt;/li&gt;
  &lt;li&gt;Divide the frequency bins into 16 buckets based on a modified version of the formula &lt;a href=&quot;http://dlbeer.co.nz/articles/fftvis.html&quot;&gt;here&lt;/a&gt; and work out the maximum magnitude of any frequency bin in the bucket, convert it to a log scale, cut off at the noise floor and smooth it using an exponential moving average with previous values. This works a lot better in the shader than putting the whole FFT into a texture and dealing with it.&lt;/li&gt;
  &lt;li&gt;Copy the audio channel data and the amplitude of each frequency bin in the FFT into a small texture. Note, this uses a fairly slow path for copying, but the texture is tiny so it has very little impact.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;oculus-integration&quot;&gt;Oculus Integration&lt;/h2&gt;
&lt;p&gt;I was very impressed with the Oculus SDK and just how simple it was to integrate. The SDK allows you to create texture swap chains that you can render to in D3D and then pass off to a compositor for display (as well as getting back a mirror texture to display in a Window) and this is very simple and integrates well.&lt;/p&gt;

&lt;p&gt;In terms of geometry, you get the tan of all the half angles for an &lt;a href=&quot;http://paulbourke.net/papers/HET409_2004/het409.pdf&quot;&gt;off-axis frustum&lt;/a&gt; per eye, as well as the poses per eye as a quaternion orientation and position. Because we’re ray-marching, we aren’t going to use a traditional projection matrix, but instead some values that will make it easy to create a ray direction from screen coordinates:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// Create rotation adjusted for handedness etc
XMVECTOR rotation = XMVectorSet( -eyePose.Orientation.x, 
                                 -eyePose.Orientation.y, 
                                 eyePose.Orientation.z, 
                                 eyePose.Orientation.w );
                                 
// Upper left corner of the view frustum at z of 1. Note, z positive, left handed. 
XMVECTOR rayScreenUpperLeft = XMVector3Rotate( XMVectorSet( -fov.LeftTan, 
                                                            fov.UpTan, 
                                                            1.0f, 
                                                            0.0f ), 

// Right direction scaled to width of the frustum at z of 1.
XMVECTOR rayScreenRight = XMVector3Rotate( XMVectorSet( fov.LeftTan + fov.RightTan,
                                                        0.0f, 
                                                        0.0f, 
                                                        0.0f ), 
                                           rotation );
                                           
// Down direction scaled to height of the frustum at z of 1.
XMVECTOR rayScreenDown = XMVector3Rotate( XMVectorSet( 0.0f, 
                                                       -( fov.DownTan + fov.UpTan ),
                                                       0.0f, 
                                                       0.0f ), 
                                          rotation );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In the shader, we’ll use the eye position we get from the Oculus SDK as the ray origin and use these values to create a ray direction. Oculus use meters as their unit, so I decided to stick with that.&lt;/p&gt;

&lt;p&gt;Oculus also takes care of the GPU sync, time warp (if needed, when you begin your frame and get the HMD position, you also get a time value that you then feed in when you submit the frame), distortion and chromatic aberration correction.&lt;/p&gt;

&lt;h2 id=&quot;file-format&quot;&gt;File Format&lt;/h2&gt;
&lt;p&gt;At the content build step, I package everything into a single file that gets memory mapped at run-time. I use the same relative addressing trick used by Per Vognsen’s &lt;a href=&quot;https://gist.github.com/pervognsen/c25a039fcf8c256141ef0778a1b32a88&quot;&gt;GOB&lt;/a&gt;, with a bit of C++ syntax sugar. The actual structures in the file are traversed in-place both at load time (to load the required resources into D3D) and per frame.&lt;/p&gt;

&lt;h2 id=&quot;rendering&quot;&gt;Rendering&lt;/h2&gt;
&lt;p&gt;Per frame, we basically get an effect id. Given that effect id, we look-up the corresponding shader and set any corresponding textures/samplers (including potentially the sound texture); all of this information comes directly out of the memory mapped file and indexes corresponding arrays of shaders/textures.&lt;/p&gt;

&lt;p&gt;While I support off-screen procedural textures that can be generated either at load time or every frame, I haven’t actually used this feature yet, so it’s a not tested. Currently these use a specified size, but at some stage I plan to make these correspond to the HMD resolution.&lt;/p&gt;

&lt;p&gt;Each package has a single vertex quad shader that is expected to generate a full-screen triangle without any input vertex or index data (it creates the coordinates directly from the ids). We never load any mesh data at all into index or vertex buffers for rendering, as all geometry will be ray-marched directly in the pixel shader.&lt;/p&gt;

&lt;p&gt;Another thing on the to-do list is to support variable resolution rendering to avoid missed frames and allow super-sampling on higher-end hardware. I currently have the minimum required card for the Rift (a R9 290), so the effects I have so far are targeted to hit 90hz with some small margin of safety at the Rift’s default render resolution on that hardware (I’ve also tested outside VR on a nvidia GTX 970M).&lt;/p&gt;

&lt;h2 id=&quot;the-visualizer-effect-in-the-video&quot;&gt;The Visualizer Effect in the Video&lt;/h2&gt;
&lt;p&gt;The visualizer effect in the video is derived from my first test-bed effect (in the source code), but was my first attempt at focusing on creating something aesthetically pleasing as opposed to just playing around (my name for the effect is “glowing blobby bars”, by the way). It’s based on the very simple frequency-bars visualization you see in pretty much every music player.&lt;/p&gt;

&lt;p&gt;To get a grounding for this, I recommend reading &lt;a href=&quot;http://iquilezles.org/www/articles/distfunctions/distfunctions.htm&quot;&gt;Inigo Quilez article on ray marching with distance functions&lt;/a&gt; and looking at &lt;a href=&quot;http://mercury.sexy/hg_sdf/&quot;&gt;Mercury’s SDF library&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Each bar’s height comes from one of the 16 frequency buckets we created in the audio step, with the bars to either side coming from the respective stereo channel.&lt;/p&gt;

&lt;p&gt;To ray march this, we create a signed distance function based on a rounded box and we use a modulus operation to repeat it, which creates a grid (where we expect that if a point is within a grid box, it is closest to the contents of the grid box than other those in other grid boxes) . We can also get the current grid coordinates by doing an integer division, which is what we do to select the frequency bucket to get the bar’s height and material (and also use as the material id).&lt;/p&gt;

&lt;p&gt;There is a slight caveat to this in that sometimes the height difference between two bars is such that a bar in another grid slot may actually be closer than the bar in the current grid slot. To avoid this, we simply space the bars conservatively relative to their maximum possible height difference. The height is actually tied to the cubed log-amplitude of the frequency bucket to make the movement a bit more dramatic.&lt;/p&gt;

&lt;p&gt;To create the blobby effect, we actually do two things. Firstly, we twist the bars using a 2D rotation based on the current y coordinate, which adds a bit more visually interesting detail, especially on tall bars. We also use a displacement function based on overlapping sine waves of different frequencies and phases tied to the current position and time, with an amplitude tied to the different frequency bins. Here’s the code for the displacement below:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;float scale = 0.25f / NoiseFloorDbSPL;

// Choose the left stereo channel
if ( from.x &amp;lt; 0 )
{
    lowFrequency = 1 - ( SoundFrequencyBuckets[ 0 ].x + 
                         SoundFrequencyBuckets[ 1 ].x + 
                         SoundFrequencyBuckets[ 2 ].x + 
                         SoundFrequencyBuckets[ 3 ].x ) * scale;
    midLowFrequency = 1 - ( SoundFrequencyBuckets[ 4 ].x + 
                            SoundFrequencyBuckets[ 5 ].x + 
                            SoundFrequencyBuckets[ 6 ].x + 
                            SoundFrequencyBuckets[ 7 ].x ) * scale;
    midHighFrequency = 1 - ( SoundFrequencyBuckets[ 8 ].x + 
                             SoundFrequencyBuckets[ 9 ].x + 
                             SoundFrequencyBuckets[ 10 ].x + 
                             SoundFrequencyBuckets[ 11 ].x ) * scale;
    highFrequency = 1 - ( SoundFrequencyBuckets[ 12 ].x + 
                          SoundFrequencyBuckets[ 13 ].y + 
                          SoundFrequencyBuckets[ 14 ].x + 
                          SoundFrequencyBuckets[ 15 ].x ) * scale;
}
else // right stereo channel
{
    lowFrequency = 1 - ( SoundFrequencyBuckets[ 0 ].y + 
                         SoundFrequencyBuckets[ 1 ].y + 
                         SoundFrequencyBuckets[ 2 ].y + 
                         SoundFrequencyBuckets[ 3 ].y ) * scale;
    midLowFrequency = 1 - ( SoundFrequencyBuckets[ 4 ].y + 
                            SoundFrequencyBuckets[ 5 ].y + 
                            SoundFrequencyBuckets[ 6 ].y + 
                            SoundFrequencyBuckets[ 7 ].y ) * scale;
    midHighFrequency = 1 - ( SoundFrequencyBuckets[ 8 ].y + 
                             SoundFrequencyBuckets[ 9 ].y + 
                             SoundFrequencyBuckets[ 10 ].y + 
                             SoundFrequencyBuckets[ 11 ].y ) * scale;
    highFrequency = 1 - ( SoundFrequencyBuckets[ 12 ].y + 
                          SoundFrequencyBuckets[ 13 ].y + 
                          SoundFrequencyBuckets[ 14 ].y + 
                          SoundFrequencyBuckets[ 15 ].y ) * scale;
}

float distortion = lowFrequency * lowFrequency * 0.8 * 
                        sin( 1.24 * from.x + Time ) *             
                        sin( 1.25 * from.y + Time * 0.9f ) * 
                        sin( 1.26 * from.z + Time * 1.1f ) +
                   midLowFrequency * midLowFrequency * midLowFrequency * 0.4 * 
                       sin( 3.0 * from.x + Time * 1.5 ) * 
                       sin( 3.1 * from.y + Time * 1.3f ) * 
                       sin( 3.2 * from.z + -Time * 1.6f ) +
                   pow( midHighFrequency, 4.0 ) * 0.5 *
                       sin( 5.71 * from.x + Time * 2.5 ) * 
                       sin( 5.72 * from.y + -Time * 2.3f ) * 
                       sin( 5.73 * from.z + Time * 2.6f ) +
                   pow( highFrequency, 5.0 ) * 0.7 * 
                       sin( 9.21 * from.x + -Time * 4.5 ) * 
                       sin( 9.22 * from.y + Time * 4.3f ) * 
                       sin( 9.23 * from.z + Time * 4.6f ) * 
                   ( from.x &amp;lt; 0 ? -1 : 1 );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There are a few issues with this displacement; first it’s not a proper distance bound so sphere tracing can sometimes fail here. Edward Kmett pointed out to me that you can make it work by reducing the distance you move along the ray relative to the maximum derivative of the displacement function, but in practice that ends up too expensive in this case, so we live with the odd artifact where sometimes a ray will teleport through a thin blob.&lt;/p&gt;

&lt;p&gt;Due to this problem with the distance bound, we can’t use the relaxed sphere tracing in the &lt;a href=&quot;http://lgdv.cs.fau.de/get/2234&quot;&gt;enhanced sphere tracing&lt;/a&gt; paper, but we do make our minimum distance cut-off relative to the radius of the pixel along the ray. Because the distance function is light enough here, we don’t actually limit the maximum number of iterations we use in the sphere tracing (the pixel radius cut-off actually puts a reasonable bound on this anyway with our relatively short view distance of 150 meters).&lt;/p&gt;

&lt;p&gt;Also, the displacement function is relatively heavy, but luckily we’re only computing it (and the entire distance function) for only the bar within the current grid area.&lt;/p&gt;

&lt;p&gt;Another issue is that with enough distance from the origin, or a large enough time, things will start to break down numerically. In practice, this hasn’t been a problem, even with the effect running for over an hour. We also reset the time every time the effect changes (currently changing is manual, but I plan to add a timer and transitions).&lt;/p&gt;

&lt;p&gt;Lighting is from a directional light which shifts slowly with time. There is a fairly standard GGX BRDF that I use for shading, but in this scene the actual colour of the bars is mostly ambient (to try and give the impression that the bars are emissive/glowing). The material colours/physically based rendering attributes come from constant arrays indexed by the material index of the closest object returned by the distance function.&lt;/p&gt;

&lt;p&gt;For the fog, the first trick we use is from Inigo’s &lt;a href=&quot;http://iquilezles.org/www/articles/fog/fog.htm&quot;&gt;better fog&lt;/a&gt;, where we factor the light into the fog (I don’t use the height in the fog here). The colour of the fog is tied to the sound RMS loudness we calculated earlier, as well as a time factor:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;float3 soundColor = float3( 0.43 + 0.3 * cos( Time * 0.1 ), 
                            0.45 + 0.3 * sin( 2.0 * M_PI * SoundRMS.x ), 
                            0.47 + 0.3 * cos( 2.0 * M_PI * SoundRMS.y ) );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This gives us a nice movement through a variety of colour ranges as the loudness of the music changes. Because of the exponential moving average smoothing we apply during the audio processing, the changes aren’t too aggressive (but be aware, this is is still relatively rapid flashing light).&lt;/p&gt;

&lt;p&gt;The glow on the bars isn’t a post process and is calculated from the distance function while ray marching. To do this, we take the size of the movement along the previous ray and the ambient colour of the closest bar and sum like this every ray step:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    glow += previousDistance * Ambient[ ( uint )distance.y ] / ( 1 + distance.x * distance.x ); 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;At the end we divide by the maximum ray distance and multiply by a constant factor to put the glow into a reasonable range. Then we add it on top of the final colour at the end. The glow gives the impression of the bars being emissive, but also enhances the fog effect quite a bit.&lt;/p&gt;

&lt;p&gt;One optimisation we do to the ray marching is to terminate rays early if they go beyond the maximum or minimum height of the bars (plus some slop distance for displacement). Past this range the glow contribution also tends to be quite small, so it hasn’t been a problem with the marching calculations for the glow.&lt;/p&gt;

&lt;h2 id=&quot;shameless-plug&quot;&gt;Shameless Plug&lt;/h2&gt;
&lt;p&gt;If you like anything here and need some work done, I’m available for freelance work via my business &lt;a href=&quot;http://burningcandle.io/&quot;&gt;Burning Candle Software&lt;/a&gt;!&lt;/p&gt;
</description>
                <link>http://ConorStokes.github.io/2016/10/12/boondoggle-the-vr-music-visualizer</link>
                <guid>http://ConorStokes.github.io/2016/10/12/boondoggle-the-vr-music-visualizer</guid>
                <pubDate>2016-10-12T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>Starting Something New</title>
                <description>
&lt;p&gt;Building software is something that I love, it’s been my hobby for over 20 years and my profession for only a few years less. I do have a life (with a family and hobbies that brings me joy) outside of it, but it is one of my true pleasures.&lt;/p&gt;

&lt;p&gt;It offers a lot: it’s a craft you can hone and perfect; there are aspects of science, maths, creativity, logic and humanity all balanced together; it can give you an enormous sense of achievement; it gives you the chance to communicate and collaborate with amazing people and it allows you a lot of mental space to go roaming.&lt;/p&gt;

&lt;p&gt;But I’ve been feeling restless for a long time, because I haven’t felt like I’ve been participating with my peers enough. The things I’ve worked on professionally, in the last few years, have been largely been things that lived behind closed doors. The circle of people I interacted with professionally was quite small.&lt;/p&gt;

&lt;p&gt;Another ennui factor is that I haven’t felt the space to be able to pursue my own ideas. I don’t believe that any one idea, by itself, is that valuable. But being able to explore it and turn it into something real is.&lt;/p&gt;

&lt;p&gt;My little side projects over the last few years have started to scratch that itch. But they, LZSSE in particular, were also enough to make me understand that I needed more.&lt;/p&gt;

&lt;p&gt;Because of that, I’ve decided to start my own business, &lt;a href=&quot;https://burningcandle.io&quot;&gt;Burning Candle Software&lt;/a&gt;. Part of what we’ll be doing will give me the chance to work with more of you (contracting, development services, consulting, mentoring). I’ve worked remotely before (both internationally and interstate), so that isn’t an obstacle for me. If you have a problem that needs solving and you think I’d be a good fit, reach out. Even if we can’t come to an arrangement, I’m always happy to help where I can.&lt;/p&gt;

&lt;p&gt;Some of that might include expanding or integrating the technology (or similar things) from this blog. If you’re interested in that, I’d be very happy to hear from you.&lt;/p&gt;

&lt;p&gt;It will also give me the freedom to choose when to pursue my own ideas, some of which will end up as open source and contributed back to the community (with the usual technical detail blog posts) and maybe even one or two will become commercial (or maybe both at the same time).&lt;/p&gt;

&lt;p&gt;Finally, I’m looking forward to getting more in touch with the local development community in Perth, who I have not had much of a chance to engage with in recent years. It will be fun both learning from them and providing mentoring where I can.&lt;/p&gt;

&lt;p&gt;I’ve had a pretty varied career; I’ve worked in games, I’ve done focused graphics and computational geometry research in a corporate lab environment, I’ve lead teams, I’ve been involved with engineering large scale projects (like smart card systems), built bespoke and packaged software used all over the world and been the lead developer/quantitative analyst for an algorithmic trading firm. I’ve had experience in areas like graphics, performance optimization, distributed systems, high performance networking, compression, image processing, machine learning, natural language processing, geographic systems and am hoping to get experience in many more (VR!).&lt;/p&gt;

&lt;p&gt;This is new for me and that’s a little intimidating. But I’m here and I want to contribute.&lt;/p&gt;
</description>
                <link>http://ConorStokes.github.io/personal/2016/06/13/starting-something-new</link>
                <guid>http://ConorStokes.github.io/personal/2016/06/13/starting-something-new</guid>
                <pubDate>2016-06-13T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>A Simple Guide to Moving Data into R</title>
                <description>
&lt;p&gt;As developers, it’s important to understand what is going on in the software we implement, whether we are designing a new algorithm, or looking at how an existing implementation is interacting with a particular data set (or even gain insights into the data set itself). &lt;a href=&quot;https://www.r-project.org/&quot;&gt;R&lt;/a&gt; is something that I use a fair bit these days for generating easy visualizations, especially when I’m looking at say, how to build a compression algorithm. I’ve been using it for around 3 years now, with good results. It’s also good for more advanced analysis, data processing and building content for presentations or the web.&lt;/p&gt;

&lt;p&gt;R has quite strong builtin capabilities, as well as a massive library of plugin packages. You can do visualizations from simple plots to interactive 3D (that can be exported to render on a web page in Web GL, via the rgl package). There are also functions for massaging data, full blown statistical analysis and machine learning. Microsoft has just released a free &lt;a href=&quot;https://www.visualstudio.com/en-us/features/rtvs-vs.aspx&quot;&gt;Visual Studio integration&lt;/a&gt; and is strongly pushing R support into it’s product range, but R has a strong open ecosystem, is available on every common desktop OS and it is usable via a number of GUI tools, IDEs and the command line.&lt;/p&gt;

&lt;p&gt;I’m not going to teach you how to use the language as much as show the way I use it in combination with software I’m actually developing. The language is pretty easy to pick up (and you don’t really need to learn that much, there are ready-to-copy of &lt;a href=&quot;http://www.cookbook-r.com/&quot;&gt;cookbooks&lt;/a&gt; that will get you most of the way there).&lt;/p&gt;

&lt;h2 id=&quot;how-i-use-r&quot;&gt;How I Use R&lt;/h2&gt;
&lt;p&gt;The typical way I use R is short scripts that take an output file, generate a visualization to a file, then open that file for viewing (R has built in display capabilities, but there are some limitations when running scripts outside of the GUI/IDE environments). It is possible to automate running the script (there is a command line utility called RScript that you can launch from your own code and it also allows command line parameters to be passed to the script) and it’s even possible to write scripts that take piped data (either from stdin or opening a local pipe).&lt;/p&gt;

&lt;p&gt;One of the biggest reasons I use R is because getting data in (and out) is very simple. In fact, if you come from a C/C++ background, where even the simplest data parsing is a detail ridden chore, the simplicity with which R lets you import data to work with straight away can be empowering. R also has built in help, so if you get stuck, you can look at the help for any function in the REPL simply by prefixing it with a question mark.&lt;/p&gt;

&lt;p&gt;The way I usually get data into R is loading a delimited file (comma, tab and custom delimited are all supported) into a data frame object. Data frames are essentially tables, they have rows and columns, where each row and column has a name (although, typically the names for the rows are ascending integers). One of the great things about doing things this way is that R will handle all the data typing automatically, columns with real numbers will work as such, as will strings (provided you get your delimiting right!). You can then access rows and columns either by name or by index ordinal (there is also slicing), or individual cells.&lt;/p&gt;

&lt;p&gt;Quite often I’ll temporarily add a statically allocated array to code to generate a histogram following what a particular algorithm is doing in code, then flush/dump it out to a file when I’ve collected the data. At other times it’s possible to just append to the file every time you want to put out a data point, as a kind of event logging (you generally only need to write a single line).&lt;/p&gt;

&lt;h2 id=&quot;example&quot;&gt;Example&lt;/h2&gt;
&lt;p&gt;Here’s a very simple example. Firstly, here is a C program that generates 2 points using two jittered linear functions (we re-use the X component, but we’re generating two separate Ys) and outputs them as simple tab separated data with column headings in the first row. Each linear function has a matching color (red or blue).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

int main()
{
    printf( &quot;X\tY\tColor\n&quot; );

    for ( int where = 0; where &amp;lt; 100; ++where )
    {
        double x = ( where + ( rand() % 15 ) ) / 50.0;
        double y1 = ( where + ( rand() % 20 ) ) / 30.0;
        double y2 = ( ( 100 - where ) + ( rand() % 20 ) ) / 40.0;

        printf( &quot;%G\t%G\tred\n&quot;, x, y1 );
        printf( &quot;%G\t%G\tblue\n&quot;, x, y2 );
    }

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We then pipe the standard output of this into a file (let’s call it “data.txt”). What does the R Script look like to turn this data into a scatter plot?&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dataTable &amp;lt;- read.table(&quot;data.txt&quot;, header=TRUE)

png(&quot;data.png&quot;, width = 512, height = 512, type = c(&quot;cairo&quot;), antialias=c(&quot;gray&quot;))

plot(x = dataTable$X,
     y = dataTable$Y,
     pch = 19,
     xlab = &quot;X&quot;,
     ylab = &quot;Y&quot;,
     col = as.character(dataTable$Color))

justRed &amp;lt;- subset(dataTable, Color == &quot;red&quot;)

abline(lm(formula=justRed$Y ~ justRed$X), col=&quot;purple&quot;)

dev.off()

browseURL(&quot;data.png&quot;, browser=NULL)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here’s what we’re doing:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Use the &lt;a href=&quot;https://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html&quot;&gt;read.table&lt;/a&gt; function to read the &lt;em&gt;data.txt&lt;/em&gt; into a data frame. We’re using the first row of the data as column headers to name the columns in the data frame. Note, there are also CSV and Excel loads you can do here, or you can use a custom separator. The read.table uses any white space as a separator by default.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Create a device that will render to a PNG file, with a width of 512, height of 512, using Cairo for rendering and a quite simple antialiasing (this makes for prettier graphs than using native rendering). Note, you can display these directly in the R GUI; the Visual Studio integration actually shows the graph in a pane inside Visual Studio.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Draw a scatter plot. We’ve used the “X” and “Y” columns from our loaded data frame, as well as the colors we provided for the individual points. We’ve also set the shape of the plot points (with pch=19). Note, you can also access columns by position and use the column names as graph labels.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;After that, we’ve selected the subset of our data where the Color column is “red” into the data frame and drawn a line using a linear regression model (with the simple formula of the Y mapping to X).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Switch off the device, which will flush the file out.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Open up the file with the associated viewer (this might only work on Windows and is an optional step).&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s the resulting image:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/simple_r_plot.png&quot; alt=&quot;Simple R plot from above&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note, this is the most basic plotting. There are many plotting libraries that produce better images, for example, here is ggplot2 using the following code (note, you’ll need to make sure you have ggplot2 package installed before you can do this):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;library(ggplot2)

dataTable &amp;lt;- read.table(&quot;data.txt&quot;, header=TRUE)

png(&quot;data.png&quot;, width = 600, height = 512, type = c(&quot;cairo&quot;), antialias=c(&quot;gray&quot;))

plotOut &amp;lt;- ggplot(dataTable, aes(x = X, y = Y, colour = Color)) +   
           scale_colour_manual(values = c(&quot;#9999CC&quot;, &quot;#CC6666&quot;)) + 
           geom_point() + 
           geom_smooth(method = &quot;lm&quot;, fill = NA)

print(plotOut)

dev.off()
   
browseURL(&quot;data.png&quot;, browser=NULL)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here’s the ggplot2 image:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ggplot_r.png&quot; alt=&quot;Simple R plot from above&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note, a neat trick if you’re using Visual Studio, the debugging watch panes will actually allow you to paste multi-row data (like array contents) directly into an Excel spreadsheet, Google Sheets, or even notepad (which will give you tab delimited output), so you can quite easily grab data directly from the debugger and then run an R Script to generate a visualization.&lt;/p&gt;

&lt;h2 id=&quot;there-is-a-more-power-available&quot;&gt;There is a More Power Available&lt;/h2&gt;
&lt;p&gt;These are very simple ways to use R to get data out of your application. Note, the way the data goes in is quite simple, but the visualization samples I’ve provided don’t really do the power of R justice. For example, &lt;a href=&quot;http://shiny.rstudio.com/&quot;&gt;Shiny&lt;/a&gt; allows you to build fully interactive visualization web applications. Here’s an app that lets you graph &lt;a href=&quot;http://www.statstudio.net/free-tools/3d-grapher/&quot;&gt;3D functions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Finally, here’s a video showing a very cool animated R visualization, which I recommend watching in HD:&lt;/p&gt;

&lt;iframe width=&quot;854&quot; height=&quot;480&quot; src=&quot;https://www.youtube.com/embed/q-R_evkpHX8&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
                <link>http://ConorStokes.github.io/r/2016/03/28/a-simple-guide-to-moving-data-into-r</link>
                <guid>http://ConorStokes.github.io/r/2016/03/28/a-simple-guide-to-moving-data-into-r</guid>
                <pubDate>2016-03-28T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>Compressor Improvements and LZSSE2 vs LZSSE8</title>
                <description>
&lt;p&gt;One of the things that I hadn’t put a lot of time into with &lt;a href=&quot;http://conorstokes.github.io/compression/2016/02/15/an-LZ-codec-designed-for-SSE-decompression&quot;&gt;LZSSE&lt;/a&gt;, when I shoved it out into the open last week, was the compressor side of things. The compressors were mainly there as a way to show that the codec/decompression functioned and although it was pretty young and experimental, I thought it was worth sharing and getting some feedback on.&lt;/p&gt;

&lt;p&gt;One of the things that became fairly apparent (and anyone who eyeballed the original benchmarks would’ve seen) is that the compression speed for LZSSE2’s optimal parser was terrible. Thanks to some pointers from the community, particularly from Charles Bloom, the match finding has been replaced with something better (an implementation of the same algorithm used in LzFind) and compression speed improved substantially. There is a very minor cost in compression ratio though on some files, although some was gained back due to fixing a bug in the cost calculations for matches. I’ve also created an LZSSE8 optimal parsing variant, LZSSE4’s is on the way.&lt;/p&gt;

&lt;p&gt;One of the changes, to prevent really bad performance with long matches (especially of the same character), is to skip completely over match finding after long matches. This can have some minor impact on compression ratio, so there is the option to disable this by pushing the compression level up to “17” on the optimal parser, which is otherwise the same as level 16. Levels 0 through to 15 just check through progressively less matches as the level gets lower (amortization).&lt;/p&gt;

&lt;p&gt;The compression changes to LZSSE8 proved rather important, because there are some files LZSSE2 really struggled with, particularly machine code binaries and less compressible data. With the compressors for LZSSE2 and LZSSE8 previously not being on equal footing, it wasn’t possible to show how much better LZSSE8 worked on those files. The quality of the compression really has quite a large impact on the performance of the decompression on those files too.&lt;/p&gt;

&lt;p&gt;Part of the end goal is to make a codec that either adapts per iteration (32 steps), or allows changing between the different codecs per block to get the ideal compression ratio and performance on a wider range of files without changing codec. This is not there yet, but the results below make a strong case for it.&lt;/p&gt;

&lt;p&gt;I was lucky enough to get some code contributed by Brian Marshall that got things working with Gcc and Clang (although, it was ported elsewhere as part of &lt;a href=&quot;https://github.com/powturbo/TurboBench&quot;&gt;turbobench&lt;/a&gt;). Performance of the decompression on Gcc lags Visual Studio by over 10% (sometimes even higher) and investigating why that is will be an interesting experiment in and of itself. The code is the same for both, there is nothing compiler specific in the decompression.&lt;/p&gt;

&lt;p&gt;I’m still intending to release a stand-alone single file utility (both as a binary and on GitHub), but there are still some changes I want to make there before it’s public.&lt;/p&gt;

&lt;p&gt;Another note, there has been a few problems with the blog comments, if you make a comment and it doesn’t show up, I haven’t deleted it. I’m still investigating why this is.&lt;/p&gt;

&lt;h2 id=&quot;updated-results&quot;&gt;Updated Results&lt;/h2&gt;

&lt;p&gt;Note, the decompression implementation hasn’t changed here. I’m using the same method for benchmarks as before (same stock clocked i7 4790, Windows 10 machine, same build settings, same lzbench code), but with the results reduced to LZSSE variants, because I mainly want to compare LZSSE2 against LZSSE8 here (the results for the other compressors haven’t changed, if you want the comparisons).&lt;/p&gt;

&lt;p&gt;The tl;dr version is that LZSSE8 lags a little on text, but is a better general purpose option, when used with the new optimal parser, than LZSSE2. LZSSE8 isn’t that far behind on text, but where LZSSE2 does badly (less compressible data, machine code and long literal runs), LZSSE8 does a lot better (this makes a convincing case for an adaptive codec). Compression speed, especially on the previous terrible cases, is a lot better.&lt;/p&gt;

&lt;p&gt;First up, enwik8; our new LZSSE2 compression implementation has given up a few bytes here and the new optimal parser for LZSSE8 is a little bit behind. Compression speed is significantly improved. No real surprises here.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11511 MB/s&lt;/td&gt;
      &lt;td&gt;11562 MB/s&lt;/td&gt;
      &lt;td&gt;100000000&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;3138 MB/s&lt;/td&gt;
      &lt;td&gt;45854485&lt;/td&gt;
      &lt;td&gt;45.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;3403 MB/s&lt;/td&gt;
      &lt;td&gt;41941798&lt;/td&gt;
      &lt;td&gt;41.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;9.37 MB/s&lt;/td&gt;
      &lt;td&gt;3739 MB/s&lt;/td&gt;
      &lt;td&gt;38121396&lt;/td&gt;
      &lt;td&gt;38.12&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;9.30 MB/s&lt;/td&gt;
      &lt;td&gt;3720 MB/s&lt;/td&gt;
      &lt;td&gt;38068526&lt;/td&gt;
      &lt;td&gt;38.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;9.28 MB/s&lt;/td&gt;
      &lt;td&gt;3718 MB/s&lt;/td&gt;
      &lt;td&gt;38068509&lt;/td&gt;
      &lt;td&gt;38.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;9.29 MB/s&lt;/td&gt;
      &lt;td&gt;3748 MB/s&lt;/td&gt;
      &lt;td&gt;38068509&lt;/td&gt;
      &lt;td&gt;38.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;9.05 MB/s&lt;/td&gt;
      &lt;td&gt;3717 MB/s&lt;/td&gt;
      &lt;td&gt;38063182&lt;/td&gt;
      &lt;td&gt;38.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;213 MB/s&lt;/td&gt;
      &lt;td&gt;3122 MB/s&lt;/td&gt;
      &lt;td&gt;47108403&lt;/td&gt;
      &lt;td&gt;47.11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;212 MB/s&lt;/td&gt;
      &lt;td&gt;3108 MB/s&lt;/td&gt;
      &lt;td&gt;47249359&lt;/td&gt;
      &lt;td&gt;47.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;3434 MB/s&lt;/td&gt;
      &lt;td&gt;41889439&lt;/td&gt;
      &lt;td&gt;41.89&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;3559 MB/s&lt;/td&gt;
      &lt;td&gt;40129972&lt;/td&gt;
      &lt;td&gt;40.13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3668 MB/s&lt;/td&gt;
      &lt;td&gt;38745570&lt;/td&gt;
      &lt;td&gt;38.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3671 MB/s&lt;/td&gt;
      &lt;td&gt;38721328&lt;/td&gt;
      &lt;td&gt;38.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3670 MB/s&lt;/td&gt;
      &lt;td&gt;38721328&lt;/td&gt;
      &lt;td&gt;38.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3698 MB/s&lt;/td&gt;
      &lt;td&gt;38721328&lt;/td&gt;
      &lt;td&gt;38.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3673 MB/s&lt;/td&gt;
      &lt;td&gt;38716643&lt;/td&gt;
      &lt;td&gt;38.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;LZSSE8 shows that with an optimal parser it’s a better generalist on the tar’d silesia corpus than LZSSE2 (which has poor handling of hard to compress data), with both stronger compression and significantly faster decompression. Compression speed again is significantly improved:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11406 MB/s&lt;/td&gt;
      &lt;td&gt;11347 MB/s&lt;/td&gt;
      &lt;td&gt;211948032&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;3182 MB/s&lt;/td&gt;
      &lt;td&gt;87976190&lt;/td&gt;
      &lt;td&gt;41.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;3392 MB/s&lt;/td&gt;
      &lt;td&gt;82172004&lt;/td&gt;
      &lt;td&gt;38.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;9.57 MB/s&lt;/td&gt;
      &lt;td&gt;3636 MB/s&lt;/td&gt;
      &lt;td&gt;76093504&lt;/td&gt;
      &lt;td&gt;35.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;8.62 MB/s&lt;/td&gt;
      &lt;td&gt;3637 MB/s&lt;/td&gt;
      &lt;td&gt;75830436&lt;/td&gt;
      &lt;td&gt;35.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;8.56 MB/s&lt;/td&gt;
      &lt;td&gt;3662 MB/s&lt;/td&gt;
      &lt;td&gt;75830178&lt;/td&gt;
      &lt;td&gt;35.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;8.77 MB/s&lt;/td&gt;
      &lt;td&gt;3663 MB/s&lt;/td&gt;
      &lt;td&gt;75830178&lt;/td&gt;
      &lt;td&gt;35.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;3.42 MB/s&lt;/td&gt;
      &lt;td&gt;3669 MB/s&lt;/td&gt;
      &lt;td&gt;75685829&lt;/td&gt;
      &lt;td&gt;35.71&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;275 MB/s&lt;/td&gt;
      &lt;td&gt;3243 MB/s&lt;/td&gt;
      &lt;td&gt;95918518&lt;/td&gt;
      &lt;td&gt;45.26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;276 MB/s&lt;/td&gt;
      &lt;td&gt;3405 MB/s&lt;/td&gt;
      &lt;td&gt;94938891&lt;/td&gt;
      &lt;td&gt;44.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;3932 MB/s&lt;/td&gt;
      &lt;td&gt;81866286&lt;/td&gt;
      &lt;td&gt;38.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;4085 MB/s&lt;/td&gt;
      &lt;td&gt;78727052&lt;/td&gt;
      &lt;td&gt;37.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;4262 MB/s&lt;/td&gt;
      &lt;td&gt;78723935&lt;/td&gt;
      &lt;td&gt;37.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;9.77 MB/s&lt;/td&gt;
      &lt;td&gt;4284 MB/s&lt;/td&gt;
      &lt;td&gt;75464683&lt;/td&gt;
      &lt;td&gt;35.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;9.70 MB/s&lt;/td&gt;
      &lt;td&gt;4283 MB/s&lt;/td&gt;
      &lt;td&gt;75464456&lt;/td&gt;
      &lt;td&gt;35.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;9.68 MB/s&lt;/td&gt;
      &lt;td&gt;4283 MB/s&lt;/td&gt;
      &lt;td&gt;75464456&lt;/td&gt;
      &lt;td&gt;35.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;3.50 MB/s&lt;/td&gt;
      &lt;td&gt;4289 MB/s&lt;/td&gt;
      &lt;td&gt;75328279&lt;/td&gt;
      &lt;td&gt;35.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Dickens favours LZSSE2, but LZSSE8 is not that far behind:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;13773 MB/s&lt;/td&gt;
      &lt;td&gt;13754 MB/s&lt;/td&gt;
      &lt;td&gt;10192446&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;2938 MB/s&lt;/td&gt;
      &lt;td&gt;5259008&lt;/td&gt;
      &lt;td&gt;51.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;3326 MB/s&lt;/td&gt;
      &lt;td&gt;4626067&lt;/td&gt;
      &lt;td&gt;45.39&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;7.96 MB/s&lt;/td&gt;
      &lt;td&gt;3935 MB/s&lt;/td&gt;
      &lt;td&gt;3878822&lt;/td&gt;
      &lt;td&gt;38.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;7.92 MB/s&lt;/td&gt;
      &lt;td&gt;3932 MB/s&lt;/td&gt;
      &lt;td&gt;3872650&lt;/td&gt;
      &lt;td&gt;38.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;7.90 MB/s&lt;/td&gt;
      &lt;td&gt;3876 MB/s&lt;/td&gt;
      &lt;td&gt;3872650&lt;/td&gt;
      &lt;td&gt;38.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;7.90 MB/s&lt;/td&gt;
      &lt;td&gt;3944 MB/s&lt;/td&gt;
      &lt;td&gt;3872650&lt;/td&gt;
      &lt;td&gt;38.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;7.78 MB/s&lt;/td&gt;
      &lt;td&gt;3942 MB/s&lt;/td&gt;
      &lt;td&gt;3872373&lt;/td&gt;
      &lt;td&gt;37.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;209 MB/s&lt;/td&gt;
      &lt;td&gt;2948 MB/s&lt;/td&gt;
      &lt;td&gt;5161515&lt;/td&gt;
      &lt;td&gt;50.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;209 MB/s&lt;/td&gt;
      &lt;td&gt;2953 MB/s&lt;/td&gt;
      &lt;td&gt;5174322&lt;/td&gt;
      &lt;td&gt;50.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;3256 MB/s&lt;/td&gt;
      &lt;td&gt;4515350&lt;/td&gt;
      &lt;td&gt;44.30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;3448 MB/s&lt;/td&gt;
      &lt;td&gt;4207915&lt;/td&gt;
      &lt;td&gt;41.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;9.12 MB/s&lt;/td&gt;
      &lt;td&gt;3734 MB/s&lt;/td&gt;
      &lt;td&gt;3922639&lt;/td&gt;
      &lt;td&gt;38.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;9.15 MB/s&lt;/td&gt;
      &lt;td&gt;3752 MB/s&lt;/td&gt;
      &lt;td&gt;3920885&lt;/td&gt;
      &lt;td&gt;38.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;9.15 MB/s&lt;/td&gt;
      &lt;td&gt;3741 MB/s&lt;/td&gt;
      &lt;td&gt;3920885&lt;/td&gt;
      &lt;td&gt;38.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;9.26 MB/s&lt;/td&gt;
      &lt;td&gt;3640 MB/s&lt;/td&gt;
      &lt;td&gt;3920885&lt;/td&gt;
      &lt;td&gt;38.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;8.98 MB/s&lt;/td&gt;
      &lt;td&gt;3751 MB/s&lt;/td&gt;
      &lt;td&gt;3920616&lt;/td&gt;
      &lt;td&gt;38.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Mozilla, LZSSE8 provides a significant decompression performance advantage and a slightly better compression ratio:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11448 MB/s&lt;/td&gt;
      &lt;td&gt;11433 MB/s&lt;/td&gt;
      &lt;td&gt;51220480&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;2744 MB/s&lt;/td&gt;
      &lt;td&gt;24591826&lt;/td&gt;
      &lt;td&gt;48.01&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;2868 MB/s&lt;/td&gt;
      &lt;td&gt;23637008&lt;/td&gt;
      &lt;td&gt;46.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;3037 MB/s&lt;/td&gt;
      &lt;td&gt;22584848&lt;/td&gt;
      &lt;td&gt;44.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;9.97 MB/s&lt;/td&gt;
      &lt;td&gt;3063 MB/s&lt;/td&gt;
      &lt;td&gt;22474739&lt;/td&gt;
      &lt;td&gt;43.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;9.93 MB/s&lt;/td&gt;
      &lt;td&gt;3064 MB/s&lt;/td&gt;
      &lt;td&gt;22474508&lt;/td&gt;
      &lt;td&gt;43.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;9.82 MB/s&lt;/td&gt;
      &lt;td&gt;3063 MB/s&lt;/td&gt;
      &lt;td&gt;22474508&lt;/td&gt;
      &lt;td&gt;43.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;2.01 MB/s&lt;/td&gt;
      &lt;td&gt;3038 MB/s&lt;/td&gt;
      &lt;td&gt;22460261&lt;/td&gt;
      &lt;td&gt;43.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;257 MB/s&lt;/td&gt;
      &lt;td&gt;2635 MB/s&lt;/td&gt;
      &lt;td&gt;27406939&lt;/td&gt;
      &lt;td&gt;53.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;261 MB/s&lt;/td&gt;
      &lt;td&gt;2817 MB/s&lt;/td&gt;
      &lt;td&gt;26993974&lt;/td&gt;
      &lt;td&gt;52.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;3369 MB/s&lt;/td&gt;
      &lt;td&gt;23512213&lt;/td&gt;
      &lt;td&gt;45.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;3477 MB/s&lt;/td&gt;
      &lt;td&gt;22941395&lt;/td&gt;
      &lt;td&gt;44.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;3646 MB/s&lt;/td&gt;
      &lt;td&gt;22243004&lt;/td&gt;
      &lt;td&gt;43.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3647 MB/s&lt;/td&gt;
      &lt;td&gt;22148536&lt;/td&gt;
      &lt;td&gt;43.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3688 MB/s&lt;/td&gt;
      &lt;td&gt;22148366&lt;/td&gt;
      &lt;td&gt;43.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3688 MB/s&lt;/td&gt;
      &lt;td&gt;22148366&lt;/td&gt;
      &lt;td&gt;43.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;1.96 MB/s&lt;/td&gt;
      &lt;td&gt;3689 MB/s&lt;/td&gt;
      &lt;td&gt;22135467&lt;/td&gt;
      &lt;td&gt;43.22&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;LZSSE8 again shows that it can significantly best LZSSE2 on some files on mr, the magnetic resonance image:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;13848 MB/s&lt;/td&gt;
      &lt;td&gt;13925 MB/s&lt;/td&gt;
      &lt;td&gt;9970564&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;30 MB/s&lt;/td&gt;
      &lt;td&gt;2801 MB/s&lt;/td&gt;
      &lt;td&gt;4847277&lt;/td&gt;
      &lt;td&gt;48.62&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;3004 MB/s&lt;/td&gt;
      &lt;td&gt;4506789&lt;/td&gt;
      &lt;td&gt;45.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;3250 MB/s&lt;/td&gt;
      &lt;td&gt;4018986&lt;/td&gt;
      &lt;td&gt;40.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;3263 MB/s&lt;/td&gt;
      &lt;td&gt;4013037&lt;/td&gt;
      &lt;td&gt;40.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;3263 MB/s&lt;/td&gt;
      &lt;td&gt;4013037&lt;/td&gt;
      &lt;td&gt;40.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;3263 MB/s&lt;/td&gt;
      &lt;td&gt;4013037&lt;/td&gt;
      &lt;td&gt;40.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;1.89 MB/s&lt;/td&gt;
      &lt;td&gt;3333 MB/s&lt;/td&gt;
      &lt;td&gt;4007016&lt;/td&gt;
      &lt;td&gt;40.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;249 MB/s&lt;/td&gt;
      &lt;td&gt;2560 MB/s&lt;/td&gt;
      &lt;td&gt;7034206&lt;/td&gt;
      &lt;td&gt;70.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;279 MB/s&lt;/td&gt;
      &lt;td&gt;2990 MB/s&lt;/td&gt;
      &lt;td&gt;6856430&lt;/td&gt;
      &lt;td&gt;68.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;3421 MB/s&lt;/td&gt;
      &lt;td&gt;4697617&lt;/td&gt;
      &lt;td&gt;47.11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;3677 MB/s&lt;/td&gt;
      &lt;td&gt;4384872&lt;/td&gt;
      &lt;td&gt;43.98&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;4058 MB/s&lt;/td&gt;
      &lt;td&gt;4037906&lt;/td&gt;
      &lt;td&gt;40.50&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;4010 MB/s&lt;/td&gt;
      &lt;td&gt;4033597&lt;/td&gt;
      &lt;td&gt;40.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;4138 MB/s&lt;/td&gt;
      &lt;td&gt;4033597&lt;/td&gt;
      &lt;td&gt;40.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;4009 MB/s&lt;/td&gt;
      &lt;td&gt;4033597&lt;/td&gt;
      &lt;td&gt;40.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;1.87 MB/s&lt;/td&gt;
      &lt;td&gt;4026 MB/s&lt;/td&gt;
      &lt;td&gt;4029062&lt;/td&gt;
      &lt;td&gt;40.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The nci database of chemical structures shows that LZSSE2 still definitely has some things it’s better at:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11550 MB/s&lt;/td&gt;
      &lt;td&gt;11642 MB/s&lt;/td&gt;
      &lt;td&gt;33553445&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;5616 MB/s&lt;/td&gt;
      &lt;td&gt;5295570&lt;/td&gt;
      &lt;td&gt;15.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;6368 MB/s&lt;/td&gt;
      &lt;td&gt;4423662&lt;/td&gt;
      &lt;td&gt;13.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;7.86 MB/s&lt;/td&gt;
      &lt;td&gt;6981 MB/s&lt;/td&gt;
      &lt;td&gt;3810991&lt;/td&gt;
      &lt;td&gt;11.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;6.17 MB/s&lt;/td&gt;
      &lt;td&gt;7110 MB/s&lt;/td&gt;
      &lt;td&gt;3749513&lt;/td&gt;
      &lt;td&gt;11.17&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;6.16 MB/s&lt;/td&gt;
      &lt;td&gt;7178 MB/s&lt;/td&gt;
      &lt;td&gt;3749513&lt;/td&gt;
      &lt;td&gt;11.17&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;6.17 MB/s&lt;/td&gt;
      &lt;td&gt;7107 MB/s&lt;/td&gt;
      &lt;td&gt;3749513&lt;/td&gt;
      &lt;td&gt;11.17&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;3.00 MB/s&lt;/td&gt;
      &lt;td&gt;7171 MB/s&lt;/td&gt;
      &lt;td&gt;3703443&lt;/td&gt;
      &lt;td&gt;11.04&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;497 MB/s&lt;/td&gt;
      &lt;td&gt;5524 MB/s&lt;/td&gt;
      &lt;td&gt;5711408&lt;/td&gt;
      &lt;td&gt;17.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;501 MB/s&lt;/td&gt;
      &lt;td&gt;5325 MB/s&lt;/td&gt;
      &lt;td&gt;5796797&lt;/td&gt;
      &lt;td&gt;17.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;5975 MB/s&lt;/td&gt;
      &lt;td&gt;4558097&lt;/td&gt;
      &lt;td&gt;13.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;6225 MB/s&lt;/td&gt;
      &lt;td&gt;4202797&lt;/td&gt;
      &lt;td&gt;12.53&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;7.94 MB/s&lt;/td&gt;
      &lt;td&gt;6538 MB/s&lt;/td&gt;
      &lt;td&gt;3903767&lt;/td&gt;
      &lt;td&gt;11.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;6.48 MB/s&lt;/td&gt;
      &lt;td&gt;6601 MB/s&lt;/td&gt;
      &lt;td&gt;3872165&lt;/td&gt;
      &lt;td&gt;11.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;6.48 MB/s&lt;/td&gt;
      &lt;td&gt;6601 MB/s&lt;/td&gt;
      &lt;td&gt;3872165&lt;/td&gt;
      &lt;td&gt;11.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;6.54 MB/s&lt;/td&gt;
      &lt;td&gt;6601 MB/s&lt;/td&gt;
      &lt;td&gt;3872165&lt;/td&gt;
      &lt;td&gt;11.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;3.09 MB/s&lt;/td&gt;
      &lt;td&gt;6638 MB/s&lt;/td&gt;
      &lt;td&gt;3828113&lt;/td&gt;
      &lt;td&gt;11.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;LZSSE8 again shows it’s strength on binaries with the ooffice dll:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;17379 MB/s&lt;/td&gt;
      &lt;td&gt;17379 MB/s&lt;/td&gt;
      &lt;td&gt;6152192&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;2205 MB/s&lt;/td&gt;
      &lt;td&gt;3821230&lt;/td&gt;
      &lt;td&gt;62.11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;2297 MB/s&lt;/td&gt;
      &lt;td&gt;3681963&lt;/td&gt;
      &lt;td&gt;59.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;2444 MB/s&lt;/td&gt;
      &lt;td&gt;3505982&lt;/td&gt;
      &lt;td&gt;56.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;2424 MB/s&lt;/td&gt;
      &lt;td&gt;3496155&lt;/td&gt;
      &lt;td&gt;56.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;2457 MB/s&lt;/td&gt;
      &lt;td&gt;3496154&lt;/td&gt;
      &lt;td&gt;56.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;2455 MB/s&lt;/td&gt;
      &lt;td&gt;3496154&lt;/td&gt;
      &lt;td&gt;56.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;7.03 MB/s&lt;/td&gt;
      &lt;td&gt;2457 MB/s&lt;/td&gt;
      &lt;td&gt;3495182&lt;/td&gt;
      &lt;td&gt;56.81&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;166 MB/s&lt;/td&gt;
      &lt;td&gt;2438 MB/s&lt;/td&gt;
      &lt;td&gt;3972687&lt;/td&gt;
      &lt;td&gt;64.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;162 MB/s&lt;/td&gt;
      &lt;td&gt;2712 MB/s&lt;/td&gt;
      &lt;td&gt;3922013&lt;/td&gt;
      &lt;td&gt;63.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;2936 MB/s&lt;/td&gt;
      &lt;td&gt;3635572&lt;/td&gt;
      &lt;td&gt;59.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;3041 MB/s&lt;/td&gt;
      &lt;td&gt;3564756&lt;/td&gt;
      &lt;td&gt;57.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;3063 MB/s&lt;/td&gt;
      &lt;td&gt;3499888&lt;/td&gt;
      &lt;td&gt;56.89&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;3097 MB/s&lt;/td&gt;
      &lt;td&gt;3494693&lt;/td&gt;
      &lt;td&gt;56.80&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;3099 MB/s&lt;/td&gt;
      &lt;td&gt;3494693&lt;/td&gt;
      &lt;td&gt;56.80&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;3062 MB/s&lt;/td&gt;
      &lt;td&gt;3494693&lt;/td&gt;
      &lt;td&gt;56.80&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;7.25 MB/s&lt;/td&gt;
      &lt;td&gt;3100 MB/s&lt;/td&gt;
      &lt;td&gt;3493814&lt;/td&gt;
      &lt;td&gt;56.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The MySQL database, osdb, strongly favours LZSSE8 as well:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;14086 MB/s&lt;/td&gt;
      &lt;td&gt;14185 MB/s&lt;/td&gt;
      &lt;td&gt;10085684&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;3200 MB/s&lt;/td&gt;
      &lt;td&gt;4333712&lt;/td&gt;
      &lt;td&gt;42.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;3308 MB/s&lt;/td&gt;
      &lt;td&gt;4172322&lt;/td&gt;
      &lt;td&gt;41.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;3546 MB/s&lt;/td&gt;
      &lt;td&gt;3960769&lt;/td&gt;
      &lt;td&gt;39.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;3555 MB/s&lt;/td&gt;
      &lt;td&gt;3957654&lt;/td&gt;
      &lt;td&gt;39.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;3556 MB/s&lt;/td&gt;
      &lt;td&gt;3957654&lt;/td&gt;
      &lt;td&gt;39.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;3557 MB/s&lt;/td&gt;
      &lt;td&gt;3957654&lt;/td&gt;
      &lt;td&gt;39.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;3558 MB/s&lt;/td&gt;
      &lt;td&gt;3957654&lt;/td&gt;
      &lt;td&gt;39.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;265 MB/s&lt;/td&gt;
      &lt;td&gt;4098 MB/s&lt;/td&gt;
      &lt;td&gt;4262592&lt;/td&gt;
      &lt;td&gt;42.26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;259 MB/s&lt;/td&gt;
      &lt;td&gt;4484 MB/s&lt;/td&gt;
      &lt;td&gt;4175474&lt;/td&gt;
      &lt;td&gt;41.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;4628 MB/s&lt;/td&gt;
      &lt;td&gt;3962308&lt;/td&gt;
      &lt;td&gt;39.29&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;4673 MB/s&lt;/td&gt;
      &lt;td&gt;3882195&lt;/td&gt;
      &lt;td&gt;38.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;4723 MB/s&lt;/td&gt;
      &lt;td&gt;3839571&lt;/td&gt;
      &lt;td&gt;38.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;4723 MB/s&lt;/td&gt;
      &lt;td&gt;3839569&lt;/td&gt;
      &lt;td&gt;38.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;4717 MB/s&lt;/td&gt;
      &lt;td&gt;3839569&lt;/td&gt;
      &lt;td&gt;38.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;4719 MB/s&lt;/td&gt;
      &lt;td&gt;3839569&lt;/td&gt;
      &lt;td&gt;38.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;4721 MB/s&lt;/td&gt;
      &lt;td&gt;3839569&lt;/td&gt;
      &lt;td&gt;38.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The Polish literature PDF Reymont definitely favours LZSSE2 though, but LZSSE8 isn’t that far out:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;16693 MB/s&lt;/td&gt;
      &lt;td&gt;16906 MB/s&lt;/td&gt;
      &lt;td&gt;6627202&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;3416 MB/s&lt;/td&gt;
      &lt;td&gt;2657481&lt;/td&gt;
      &lt;td&gt;40.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;4004 MB/s&lt;/td&gt;
      &lt;td&gt;2309022&lt;/td&gt;
      &lt;td&gt;34.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;7.55 MB/s&lt;/td&gt;
      &lt;td&gt;4883 MB/s&lt;/td&gt;
      &lt;td&gt;1867895&lt;/td&gt;
      &lt;td&gt;28.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;7.32 MB/s&lt;/td&gt;
      &lt;td&gt;4967 MB/s&lt;/td&gt;
      &lt;td&gt;1852687&lt;/td&gt;
      &lt;td&gt;27.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;7.30 MB/s&lt;/td&gt;
      &lt;td&gt;4994 MB/s&lt;/td&gt;
      &lt;td&gt;1852684&lt;/td&gt;
      &lt;td&gt;27.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;7.30 MB/s&lt;/td&gt;
      &lt;td&gt;4990 MB/s&lt;/td&gt;
      &lt;td&gt;1852684&lt;/td&gt;
      &lt;td&gt;27.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;7.26 MB/s&lt;/td&gt;
      &lt;td&gt;4960 MB/s&lt;/td&gt;
      &lt;td&gt;1852682&lt;/td&gt;
      &lt;td&gt;27.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;252 MB/s&lt;/td&gt;
      &lt;td&gt;2989 MB/s&lt;/td&gt;
      &lt;td&gt;2952727&lt;/td&gt;
      &lt;td&gt;44.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;251 MB/s&lt;/td&gt;
      &lt;td&gt;3020 MB/s&lt;/td&gt;
      &lt;td&gt;2925190&lt;/td&gt;
      &lt;td&gt;44.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;3659 MB/s&lt;/td&gt;
      &lt;td&gt;2402352&lt;/td&gt;
      &lt;td&gt;36.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;4001 MB/s&lt;/td&gt;
      &lt;td&gt;2179138&lt;/td&gt;
      &lt;td&gt;32.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;8.10 MB/s&lt;/td&gt;
      &lt;td&gt;4409 MB/s&lt;/td&gt;
      &lt;td&gt;1905807&lt;/td&gt;
      &lt;td&gt;28.76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;8.00 MB/s&lt;/td&gt;
      &lt;td&gt;4394 MB/s&lt;/td&gt;
      &lt;td&gt;1901961&lt;/td&gt;
      &lt;td&gt;28.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;8.01 MB/s&lt;/td&gt;
      &lt;td&gt;4391 MB/s&lt;/td&gt;
      &lt;td&gt;1901958&lt;/td&gt;
      &lt;td&gt;28.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;8.01 MB/s&lt;/td&gt;
      &lt;td&gt;4415 MB/s&lt;/td&gt;
      &lt;td&gt;1901958&lt;/td&gt;
      &lt;td&gt;28.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;7.97 MB/s&lt;/td&gt;
      &lt;td&gt;4415 MB/s&lt;/td&gt;
      &lt;td&gt;1901955&lt;/td&gt;
      &lt;td&gt;28.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The samba source code offers a bit of a surprise, also doing better on LZSSE8. I haven’t studied the compression characteristics of source code too much, but expected it to favour LZSSE2 due to it’s favouring matches over literals.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11781 MB/s&lt;/td&gt;
      &lt;td&gt;11781 MB/s&lt;/td&gt;
      &lt;td&gt;21606400&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;4017 MB/s&lt;/td&gt;
      &lt;td&gt;6883306&lt;/td&gt;
      &lt;td&gt;31.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;4201 MB/s&lt;/td&gt;
      &lt;td&gt;6511387&lt;/td&gt;
      &lt;td&gt;30.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;4330 MB/s&lt;/td&gt;
      &lt;td&gt;6177369&lt;/td&gt;
      &lt;td&gt;28.59&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;9.45 MB/s&lt;/td&gt;
      &lt;td&gt;4336 MB/s&lt;/td&gt;
      &lt;td&gt;6161485&lt;/td&gt;
      &lt;td&gt;28.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;8.56 MB/s&lt;/td&gt;
      &lt;td&gt;4333 MB/s&lt;/td&gt;
      &lt;td&gt;6161465&lt;/td&gt;
      &lt;td&gt;28.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;8.54 MB/s&lt;/td&gt;
      &lt;td&gt;4292 MB/s&lt;/td&gt;
      &lt;td&gt;6161465&lt;/td&gt;
      &lt;td&gt;28.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;2.57 MB/s&lt;/td&gt;
      &lt;td&gt;4379 MB/s&lt;/td&gt;
      &lt;td&gt;6093318&lt;/td&gt;
      &lt;td&gt;28.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;300 MB/s&lt;/td&gt;
      &lt;td&gt;3997 MB/s&lt;/td&gt;
      &lt;td&gt;7601765&lt;/td&gt;
      &lt;td&gt;35.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;298 MB/s&lt;/td&gt;
      &lt;td&gt;4136 MB/s&lt;/td&gt;
      &lt;td&gt;7582300&lt;/td&gt;
      &lt;td&gt;35.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;4656 MB/s&lt;/td&gt;
      &lt;td&gt;6433602&lt;/td&gt;
      &lt;td&gt;29.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;4761 MB/s&lt;/td&gt;
      &lt;td&gt;6220494&lt;/td&gt;
      &lt;td&gt;28.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;4860 MB/s&lt;/td&gt;
      &lt;td&gt;6043129&lt;/td&gt;
      &lt;td&gt;27.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;4880 MB/s&lt;/td&gt;
      &lt;td&gt;6030715&lt;/td&gt;
      &lt;td&gt;27.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;9.57 MB/s&lt;/td&gt;
      &lt;td&gt;4931 MB/s&lt;/td&gt;
      &lt;td&gt;6030693&lt;/td&gt;
      &lt;td&gt;27.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;9.58 MB/s&lt;/td&gt;
      &lt;td&gt;4930 MB/s&lt;/td&gt;
      &lt;td&gt;6030693&lt;/td&gt;
      &lt;td&gt;27.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;2.58 MB/s&lt;/td&gt;
      &lt;td&gt;4956 MB/s&lt;/td&gt;
      &lt;td&gt;5965309&lt;/td&gt;
      &lt;td&gt;27.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The SAO star catalog is less compressible and LZSSE2 does very poorly compared to LZSSE8 here:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;15938 MB/s&lt;/td&gt;
      &lt;td&gt;16044 MB/s&lt;/td&gt;
      &lt;td&gt;7251944&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;24 MB/s&lt;/td&gt;
      &lt;td&gt;1785 MB/s&lt;/td&gt;
      &lt;td&gt;6487976&lt;/td&gt;
      &lt;td&gt;89.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;1817 MB/s&lt;/td&gt;
      &lt;td&gt;6304480&lt;/td&gt;
      &lt;td&gt;86.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;1888 MB/s&lt;/td&gt;
      &lt;td&gt;6068279&lt;/td&gt;
      &lt;td&gt;83.68&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;1885 MB/s&lt;/td&gt;
      &lt;td&gt;6066923&lt;/td&gt;
      &lt;td&gt;83.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;1903 MB/s&lt;/td&gt;
      &lt;td&gt;6066923&lt;/td&gt;
      &lt;td&gt;83.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;1870 MB/s&lt;/td&gt;
      &lt;td&gt;6066923&lt;/td&gt;
      &lt;td&gt;83.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;1887 MB/s&lt;/td&gt;
      &lt;td&gt;6066923&lt;/td&gt;
      &lt;td&gt;83.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;167 MB/s&lt;/td&gt;
      &lt;td&gt;2433 MB/s&lt;/td&gt;
      &lt;td&gt;6305407&lt;/td&gt;
      &lt;td&gt;86.95&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;167 MB/s&lt;/td&gt;
      &lt;td&gt;3268 MB/s&lt;/td&gt;
      &lt;td&gt;6045723&lt;/td&gt;
      &lt;td&gt;83.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;23 MB/s&lt;/td&gt;
      &lt;td&gt;3486 MB/s&lt;/td&gt;
      &lt;td&gt;5826841&lt;/td&gt;
      &lt;td&gt;80.35&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;3684 MB/s&lt;/td&gt;
      &lt;td&gt;5713888&lt;/td&gt;
      &lt;td&gt;78.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;3875 MB/s&lt;/td&gt;
      &lt;td&gt;5575656&lt;/td&gt;
      &lt;td&gt;76.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;3857 MB/s&lt;/td&gt;
      &lt;td&gt;5575361&lt;/td&gt;
      &lt;td&gt;76.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;3832 MB/s&lt;/td&gt;
      &lt;td&gt;5575361&lt;/td&gt;
      &lt;td&gt;76.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;3804 MB/s&lt;/td&gt;
      &lt;td&gt;5575361&lt;/td&gt;
      &lt;td&gt;76.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;3861 MB/s&lt;/td&gt;
      &lt;td&gt;5575361&lt;/td&gt;
      &lt;td&gt;76.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The webster dictionary has LZSSE2 edging out LZSSE8, but not by much:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11596 MB/s&lt;/td&gt;
      &lt;td&gt;11545 MB/s&lt;/td&gt;
      &lt;td&gt;41458703&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;3703 MB/s&lt;/td&gt;
      &lt;td&gt;15546126&lt;/td&gt;
      &lt;td&gt;37.50&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;4087 MB/s&lt;/td&gt;
      &lt;td&gt;13932531&lt;/td&gt;
      &lt;td&gt;33.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;8.30 MB/s&lt;/td&gt;
      &lt;td&gt;4479 MB/s&lt;/td&gt;
      &lt;td&gt;12405168&lt;/td&gt;
      &lt;td&gt;29.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;8.12 MB/s&lt;/td&gt;
      &lt;td&gt;4477 MB/s&lt;/td&gt;
      &lt;td&gt;12372822&lt;/td&gt;
      &lt;td&gt;29.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;8.12 MB/s&lt;/td&gt;
      &lt;td&gt;4483 MB/s&lt;/td&gt;
      &lt;td&gt;12372822&lt;/td&gt;
      &lt;td&gt;29.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;8.12 MB/s&lt;/td&gt;
      &lt;td&gt;4441 MB/s&lt;/td&gt;
      &lt;td&gt;12372822&lt;/td&gt;
      &lt;td&gt;29.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;8.12 MB/s&lt;/td&gt;
      &lt;td&gt;4444 MB/s&lt;/td&gt;
      &lt;td&gt;12372794&lt;/td&gt;
      &lt;td&gt;29.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;242 MB/s&lt;/td&gt;
      &lt;td&gt;3542 MB/s&lt;/td&gt;
      &lt;td&gt;16613479&lt;/td&gt;
      &lt;td&gt;40.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;238 MB/s&lt;/td&gt;
      &lt;td&gt;3376 MB/s&lt;/td&gt;
      &lt;td&gt;16775799&lt;/td&gt;
      &lt;td&gt;40.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;3910 MB/s&lt;/td&gt;
      &lt;td&gt;14218534&lt;/td&gt;
      &lt;td&gt;34.30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;4069 MB/s&lt;/td&gt;
      &lt;td&gt;13404951&lt;/td&gt;
      &lt;td&gt;32.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;9.12 MB/s&lt;/td&gt;
      &lt;td&gt;4191 MB/s&lt;/td&gt;
      &lt;td&gt;12700224&lt;/td&gt;
      &lt;td&gt;30.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;8.98 MB/s&lt;/td&gt;
      &lt;td&gt;4191 MB/s&lt;/td&gt;
      &lt;td&gt;12685372&lt;/td&gt;
      &lt;td&gt;30.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;8.98 MB/s&lt;/td&gt;
      &lt;td&gt;4192 MB/s&lt;/td&gt;
      &lt;td&gt;12685372&lt;/td&gt;
      &lt;td&gt;30.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;8.98 MB/s&lt;/td&gt;
      &lt;td&gt;4229 MB/s&lt;/td&gt;
      &lt;td&gt;12685372&lt;/td&gt;
      &lt;td&gt;30.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;9.01 MB/s&lt;/td&gt;
      &lt;td&gt;4196 MB/s&lt;/td&gt;
      &lt;td&gt;12685361&lt;/td&gt;
      &lt;td&gt;30.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;LZSSE2 edges out LZSSE8 on xml, but it is pretty close:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;18624 MB/s&lt;/td&gt;
      &lt;td&gt;18624 MB/s&lt;/td&gt;
      &lt;td&gt;5345280&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;5873 MB/s&lt;/td&gt;
      &lt;td&gt;1003195&lt;/td&gt;
      &lt;td&gt;18.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;6303 MB/s&lt;/td&gt;
      &lt;td&gt;885118&lt;/td&gt;
      &lt;td&gt;16.56&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;9.64 MB/s&lt;/td&gt;
      &lt;td&gt;6706 MB/s&lt;/td&gt;
      &lt;td&gt;778294&lt;/td&gt;
      &lt;td&gt;14.56&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;9.49 MB/s&lt;/td&gt;
      &lt;td&gt;6706 MB/s&lt;/td&gt;
      &lt;td&gt;776774&lt;/td&gt;
      &lt;td&gt;14.53&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;9.40 MB/s&lt;/td&gt;
      &lt;td&gt;6706 MB/s&lt;/td&gt;
      &lt;td&gt;776774&lt;/td&gt;
      &lt;td&gt;14.53&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;9.42 MB/s&lt;/td&gt;
      &lt;td&gt;6706 MB/s&lt;/td&gt;
      &lt;td&gt;776774&lt;/td&gt;
      &lt;td&gt;14.53&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;3.23 MB/s&lt;/td&gt;
      &lt;td&gt;6766 MB/s&lt;/td&gt;
      &lt;td&gt;768186&lt;/td&gt;
      &lt;td&gt;14.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;380 MB/s&lt;/td&gt;
      &lt;td&gt;4413 MB/s&lt;/td&gt;
      &lt;td&gt;1388503&lt;/td&gt;
      &lt;td&gt;25.98&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;377 MB/s&lt;/td&gt;
      &lt;td&gt;4189 MB/s&lt;/td&gt;
      &lt;td&gt;1406119&lt;/td&gt;
      &lt;td&gt;26.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;5932 MB/s&lt;/td&gt;
      &lt;td&gt;919525&lt;/td&gt;
      &lt;td&gt;17.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;6215 MB/s&lt;/td&gt;
      &lt;td&gt;849715&lt;/td&gt;
      &lt;td&gt;15.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;6424 MB/s&lt;/td&gt;
      &lt;td&gt;793567&lt;/td&gt;
      &lt;td&gt;14.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;6455 MB/s&lt;/td&gt;
      &lt;td&gt;792369&lt;/td&gt;
      &lt;td&gt;14.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;6455 MB/s&lt;/td&gt;
      &lt;td&gt;792369&lt;/td&gt;
      &lt;td&gt;14.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;6447 MB/s&lt;/td&gt;
      &lt;td&gt;792369&lt;/td&gt;
      &lt;td&gt;14.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;3.27 MB/s&lt;/td&gt;
      &lt;td&gt;6494 MB/s&lt;/td&gt;
      &lt;td&gt;784226&lt;/td&gt;
      &lt;td&gt;14.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The x-ray file is interesting, it favours LZSSE2 on compression ratio and LZSSE8 is significantly faster on decompression speed (which you would expect for this less compressible data):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;15186 MB/s&lt;/td&gt;
      &lt;td&gt;15268 MB/s&lt;/td&gt;
      &lt;td&gt;8474240&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;25 MB/s&lt;/td&gt;
      &lt;td&gt;1617 MB/s&lt;/td&gt;
      &lt;td&gt;7249233&lt;/td&gt;
      &lt;td&gt;85.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;1623 MB/s&lt;/td&gt;
      &lt;td&gt;7181547&lt;/td&gt;
      &lt;td&gt;84.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;1637 MB/s&lt;/td&gt;
      &lt;td&gt;7036083&lt;/td&gt;
      &lt;td&gt;83.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;1637 MB/s&lt;/td&gt;
      &lt;td&gt;7036044&lt;/td&gt;
      &lt;td&gt;83.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;1625 MB/s&lt;/td&gt;
      &lt;td&gt;7036044&lt;/td&gt;
      &lt;td&gt;83.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;1624 MB/s&lt;/td&gt;
      &lt;td&gt;7036044&lt;/td&gt;
      &lt;td&gt;83.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;1624 MB/s&lt;/td&gt;
      &lt;td&gt;7036044&lt;/td&gt;
      &lt;td&gt;83.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;175 MB/s&lt;/td&gt;
      &lt;td&gt;2361 MB/s&lt;/td&gt;
      &lt;td&gt;7525821&lt;/td&gt;
      &lt;td&gt;88.81&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;172 MB/s&lt;/td&gt;
      &lt;td&gt;3078 MB/s&lt;/td&gt;
      &lt;td&gt;7248659&lt;/td&gt;
      &lt;td&gt;85.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;3020 MB/s&lt;/td&gt;
      &lt;td&gt;7183700&lt;/td&gt;
      &lt;td&gt;84.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;26 MB/s&lt;/td&gt;
      &lt;td&gt;3053 MB/s&lt;/td&gt;
      &lt;td&gt;7171372&lt;/td&gt;
      &lt;td&gt;84.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;25 MB/s&lt;/td&gt;
      &lt;td&gt;3058 MB/s&lt;/td&gt;
      &lt;td&gt;7169088&lt;/td&gt;
      &lt;td&gt;84.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;26 MB/s&lt;/td&gt;
      &lt;td&gt;3052 MB/s&lt;/td&gt;
      &lt;td&gt;7169084&lt;/td&gt;
      &lt;td&gt;84.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;25 MB/s&lt;/td&gt;
      &lt;td&gt;3061 MB/s&lt;/td&gt;
      &lt;td&gt;7169084&lt;/td&gt;
      &lt;td&gt;84.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;25 MB/s&lt;/td&gt;
      &lt;td&gt;3060 MB/s&lt;/td&gt;
      &lt;td&gt;7169084&lt;/td&gt;
      &lt;td&gt;84.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;25 MB/s&lt;/td&gt;
      &lt;td&gt;3051 MB/s&lt;/td&gt;
      &lt;td&gt;7169084&lt;/td&gt;
      &lt;td&gt;84.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The enwik9 text heavy benchmark again favours LZSSE2, but not by much:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;3644 MB/s&lt;/td&gt;
      &lt;td&gt;3699 MB/s&lt;/td&gt;
      &lt;td&gt;1000000000&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;3424 MB/s&lt;/td&gt;
      &lt;td&gt;405899410&lt;/td&gt;
      &lt;td&gt;40.59&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;3685 MB/s&lt;/td&gt;
      &lt;td&gt;372353993&lt;/td&gt;
      &lt;td&gt;37.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;9.49 MB/s&lt;/td&gt;
      &lt;td&gt;3935 MB/s&lt;/td&gt;
      &lt;td&gt;340990265&lt;/td&gt;
      &lt;td&gt;34.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;9.24 MB/s&lt;/td&gt;
      &lt;td&gt;3929 MB/s&lt;/td&gt;
      &lt;td&gt;340559550&lt;/td&gt;
      &lt;td&gt;34.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;9.34 MB/s&lt;/td&gt;
      &lt;td&gt;3980 MB/s&lt;/td&gt;
      &lt;td&gt;340558897&lt;/td&gt;
      &lt;td&gt;34.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;9.34 MB/s&lt;/td&gt;
      &lt;td&gt;3908 MB/s&lt;/td&gt;
      &lt;td&gt;340558894&lt;/td&gt;
      &lt;td&gt;34.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;7.89 MB/s&lt;/td&gt;
      &lt;td&gt;3954 MB/s&lt;/td&gt;
      &lt;td&gt;340293998&lt;/td&gt;
      &lt;td&gt;34.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;221 MB/s&lt;/td&gt;
      &lt;td&gt;3344 MB/s&lt;/td&gt;
      &lt;td&gt;425848263&lt;/td&gt;
      &lt;td&gt;42.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;216 MB/s&lt;/td&gt;
      &lt;td&gt;3281 MB/s&lt;/td&gt;
      &lt;td&gt;427471454&lt;/td&gt;
      &lt;td&gt;42.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;3689 MB/s&lt;/td&gt;
      &lt;td&gt;374183459&lt;/td&gt;
      &lt;td&gt;37.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;3643 MB/s&lt;/td&gt;
      &lt;td&gt;358878280&lt;/td&gt;
      &lt;td&gt;35.89&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3926 MB/s&lt;/td&gt;
      &lt;td&gt;347111696&lt;/td&gt;
      &lt;td&gt;34.71&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3905 MB/s&lt;/td&gt;
      &lt;td&gt;346907396&lt;/td&gt;
      &lt;td&gt;34.69&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3923 MB/s&lt;/td&gt;
      &lt;td&gt;346907021&lt;/td&gt;
      &lt;td&gt;34.69&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;3937 MB/s&lt;/td&gt;
      &lt;td&gt;346907020&lt;/td&gt;
      &lt;td&gt;34.69&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;9.25 MB/s&lt;/td&gt;
      &lt;td&gt;3926 MB/s&lt;/td&gt;
      &lt;td&gt;346660075&lt;/td&gt;
      &lt;td&gt;34.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Finally, this is a new benchmark, the app3 file from &lt;a href=&quot;http://www.compressionratings.com/&quot;&gt;compression ratings&lt;/a&gt;. It was brought to my attention on encode.ru. LZSSE2 does very poorly on this file, while LZSSE8 does significantly better in terms of compression ratio and decompression speed (note, I’ve included more results here because this wasn’t in the previous post):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11442 MB/s&lt;/td&gt;
      &lt;td&gt;11390 MB/s&lt;/td&gt;
      &lt;td&gt;100098560&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1369 MB/s&lt;/td&gt;
      &lt;td&gt;10755 MB/s&lt;/td&gt;
      &lt;td&gt;99783925&lt;/td&gt;
      &lt;td&gt;99.69&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;733 MB/s&lt;/td&gt;
      &lt;td&gt;10115 MB/s&lt;/td&gt;
      &lt;td&gt;98845453&lt;/td&gt;
      &lt;td&gt;98.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;311 MB/s&lt;/td&gt;
      &lt;td&gt;2129 MB/s&lt;/td&gt;
      &lt;td&gt;72486401&lt;/td&gt;
      &lt;td&gt;72.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;267 MB/s&lt;/td&gt;
      &lt;td&gt;1166 MB/s&lt;/td&gt;
      &lt;td&gt;62088582&lt;/td&gt;
      &lt;td&gt;62.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;124 MB/s&lt;/td&gt;
      &lt;td&gt;260 MB/s&lt;/td&gt;
      &lt;td&gt;56188157&lt;/td&gt;
      &lt;td&gt;56.13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;244 MB/s&lt;/td&gt;
      &lt;td&gt;52205980&lt;/td&gt;
      &lt;td&gt;52.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;9.85 MB/s&lt;/td&gt;
      &lt;td&gt;256 MB/s&lt;/td&gt;
      &lt;td&gt;50786667&lt;/td&gt;
      &lt;td&gt;50.74&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;2.35 MB/s&lt;/td&gt;
      &lt;td&gt;260 MB/s&lt;/td&gt;
      &lt;td&gt;49887073&lt;/td&gt;
      &lt;td&gt;49.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;239 MB/s&lt;/td&gt;
      &lt;td&gt;766 MB/s&lt;/td&gt;
      &lt;td&gt;63274586&lt;/td&gt;
      &lt;td&gt;63.21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;291 MB/s&lt;/td&gt;
      &lt;td&gt;752 MB/s&lt;/td&gt;
      &lt;td&gt;61682776&lt;/td&gt;
      &lt;td&gt;61.62&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;731 MB/s&lt;/td&gt;
      &lt;td&gt;3361 MB/s&lt;/td&gt;
      &lt;td&gt;61938601&lt;/td&gt;
      &lt;td&gt;61.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;891 MB/s&lt;/td&gt;
      &lt;td&gt;3567 MB/s&lt;/td&gt;
      &lt;td&gt;65030520&lt;/td&gt;
      &lt;td&gt;64.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1494 MB/s&lt;/td&gt;
      &lt;td&gt;4653 MB/s&lt;/td&gt;
      &lt;td&gt;76451494&lt;/td&gt;
      &lt;td&gt;76.38&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;115 MB/s&lt;/td&gt;
      &lt;td&gt;3143 MB/s&lt;/td&gt;
      &lt;td&gt;57430191&lt;/td&gt;
      &lt;td&gt;57.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;69 MB/s&lt;/td&gt;
      &lt;td&gt;3330 MB/s&lt;/td&gt;
      &lt;td&gt;54955555&lt;/td&gt;
      &lt;td&gt;54.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;44 MB/s&lt;/td&gt;
      &lt;td&gt;3367 MB/s&lt;/td&gt;
      &lt;td&gt;54423515&lt;/td&gt;
      &lt;td&gt;54.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;30 MB/s&lt;/td&gt;
      &lt;td&gt;3381 MB/s&lt;/td&gt;
      &lt;td&gt;54396882&lt;/td&gt;
      &lt;td&gt;54.34&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;3346 MB/s&lt;/td&gt;
      &lt;td&gt;54387597&lt;/td&gt;
      &lt;td&gt;54.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;294 MB/s&lt;/td&gt;
      &lt;td&gt;833 MB/s&lt;/td&gt;
      &lt;td&gt;63635905&lt;/td&gt;
      &lt;td&gt;63.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;291 MB/s&lt;/td&gt;
      &lt;td&gt;840 MB/s&lt;/td&gt;
      &lt;td&gt;62477667&lt;/td&gt;
      &lt;td&gt;62.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;34 MB/s&lt;/td&gt;
      &lt;td&gt;619 MB/s&lt;/td&gt;
      &lt;td&gt;63535191&lt;/td&gt;
      &lt;td&gt;63.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;30 MB/s&lt;/td&gt;
      &lt;td&gt;633 MB/s&lt;/td&gt;
      &lt;td&gt;59258839&lt;/td&gt;
      &lt;td&gt;59.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;23 MB/s&lt;/td&gt;
      &lt;td&gt;641 MB/s&lt;/td&gt;
      &lt;td&gt;57202956&lt;/td&gt;
      &lt;td&gt;57.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;659 MB/s&lt;/td&gt;
      &lt;td&gt;55031252&lt;/td&gt;
      &lt;td&gt;54.98&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;9.64 MB/s&lt;/td&gt;
      &lt;td&gt;203 MB/s&lt;/td&gt;
      &lt;td&gt;47035821&lt;/td&gt;
      &lt;td&gt;46.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.42 MB/s&lt;/td&gt;
      &lt;td&gt;314 MB/s&lt;/td&gt;
      &lt;td&gt;34502612&lt;/td&gt;
      &lt;td&gt;34.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;313 MB/s&lt;/td&gt;
      &lt;td&gt;574 MB/s&lt;/td&gt;
      &lt;td&gt;71511986&lt;/td&gt;
      &lt;td&gt;71.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;47 MB/s&lt;/td&gt;
      &lt;td&gt;48231641&lt;/td&gt;
      &lt;td&gt;48.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;51 MB/s&lt;/td&gt;
      &lt;td&gt;45721294&lt;/td&gt;
      &lt;td&gt;45.68&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;8.74 MB/s&lt;/td&gt;
      &lt;td&gt;54 MB/s&lt;/td&gt;
      &lt;td&gt;44384338&lt;/td&gt;
      &lt;td&gt;44.34&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;3.79 MB/s&lt;/td&gt;
      &lt;td&gt;56 MB/s&lt;/td&gt;
      &lt;td&gt;41396555&lt;/td&gt;
      &lt;td&gt;41.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;231 MB/s&lt;/td&gt;
      &lt;td&gt;580 MB/s&lt;/td&gt;
      &lt;td&gt;68040073&lt;/td&gt;
      &lt;td&gt;67.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;191 MB/s&lt;/td&gt;
      &lt;td&gt;700 MB/s&lt;/td&gt;
      &lt;td&gt;67669680&lt;/td&gt;
      &lt;td&gt;67.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;329 MB/s&lt;/td&gt;
      &lt;td&gt;665 MB/s&lt;/td&gt;
      &lt;td&gt;65336925&lt;/td&gt;
      &lt;td&gt;65.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;329 MB/s&lt;/td&gt;
      &lt;td&gt;488 MB/s&lt;/td&gt;
      &lt;td&gt;63955770&lt;/td&gt;
      &lt;td&gt;63.89&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;125 MB/s&lt;/td&gt;
      &lt;td&gt;487 MB/s&lt;/td&gt;
      &lt;td&gt;61433299&lt;/td&gt;
      &lt;td&gt;61.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 1&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;2245 MB/s&lt;/td&gt;
      &lt;td&gt;62862916&lt;/td&gt;
      &lt;td&gt;62.80&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 2&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;2320 MB/s&lt;/td&gt;
      &lt;td&gt;61190732&lt;/td&gt;
      &lt;td&gt;61.13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 4&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;2384 MB/s&lt;/td&gt;
      &lt;td&gt;59622902&lt;/td&gt;
      &lt;td&gt;59.56&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 8&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;2393 MB/s&lt;/td&gt;
      &lt;td&gt;59490753&lt;/td&gt;
      &lt;td&gt;59.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 12&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;2394 MB/s&lt;/td&gt;
      &lt;td&gt;59490213&lt;/td&gt;
      &lt;td&gt;59.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 16&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;2393 MB/s&lt;/td&gt;
      &lt;td&gt;59490213&lt;/td&gt;
      &lt;td&gt;59.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1 level 17&lt;/td&gt;
      &lt;td&gt;2.77 MB/s&lt;/td&gt;
      &lt;td&gt;2396 MB/s&lt;/td&gt;
      &lt;td&gt;59403900&lt;/td&gt;
      &lt;td&gt;59.35&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;241 MB/s&lt;/td&gt;
      &lt;td&gt;2751 MB/s&lt;/td&gt;
      &lt;td&gt;64507471&lt;/td&gt;
      &lt;td&gt;64.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8f 0.1&lt;/td&gt;
      &lt;td&gt;244 MB/s&lt;/td&gt;
      &lt;td&gt;3480 MB/s&lt;/td&gt;
      &lt;td&gt;62616595&lt;/td&gt;
      &lt;td&gt;62.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 1&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;3846 MB/s&lt;/td&gt;
      &lt;td&gt;57314135&lt;/td&gt;
      &lt;td&gt;57.26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 2&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;3936 MB/s&lt;/td&gt;
      &lt;td&gt;56417687&lt;/td&gt;
      &lt;td&gt;56.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 4&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;4015 MB/s&lt;/td&gt;
      &lt;td&gt;55656294&lt;/td&gt;
      &lt;td&gt;55.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 8&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;4033 MB/s&lt;/td&gt;
      &lt;td&gt;55563258&lt;/td&gt;
      &lt;td&gt;55.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 12&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;4035 MB/s&lt;/td&gt;
      &lt;td&gt;55562882&lt;/td&gt;
      &lt;td&gt;55.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 16&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;4032 MB/s&lt;/td&gt;
      &lt;td&gt;55562882&lt;/td&gt;
      &lt;td&gt;55.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8o 0.1 level 17&lt;/td&gt;
      &lt;td&gt;2.76 MB/s&lt;/td&gt;
      &lt;td&gt;4039 MB/s&lt;/td&gt;
      &lt;td&gt;55482271&lt;/td&gt;
      &lt;td&gt;55.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;437 MB/s&lt;/td&gt;
      &lt;td&gt;487 MB/s&lt;/td&gt;
      &lt;td&gt;62035785&lt;/td&gt;
      &lt;td&gt;61.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;190 MB/s&lt;/td&gt;
      &lt;td&gt;394 MB/s&lt;/td&gt;
      &lt;td&gt;59010932&lt;/td&gt;
      &lt;td&gt;58.95&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;50 MB/s&lt;/td&gt;
      &lt;td&gt;918 MB/s&lt;/td&gt;
      &lt;td&gt;56738552&lt;/td&gt;
      &lt;td&gt;56.68&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;57 MB/s&lt;/td&gt;
      &lt;td&gt;583 MB/s&lt;/td&gt;
      &lt;td&gt;58727991&lt;/td&gt;
      &lt;td&gt;58.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;35 MB/s&lt;/td&gt;
      &lt;td&gt;577 MB/s&lt;/td&gt;
      &lt;td&gt;56893671&lt;/td&gt;
      &lt;td&gt;56.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;24 MB/s&lt;/td&gt;
      &lt;td&gt;580 MB/s&lt;/td&gt;
      &lt;td&gt;56199900&lt;/td&gt;
      &lt;td&gt;56.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;575 MB/s&lt;/td&gt;
      &lt;td&gt;55916030&lt;/td&gt;
      &lt;td&gt;55.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;120 MB/s&lt;/td&gt;
      &lt;td&gt;2722 MB/s&lt;/td&gt;
      &lt;td&gt;64009309&lt;/td&gt;
      &lt;td&gt;63.95&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;102 MB/s&lt;/td&gt;
      &lt;td&gt;3031 MB/s&lt;/td&gt;
      &lt;td&gt;62084911&lt;/td&gt;
      &lt;td&gt;62.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;84 MB/s&lt;/td&gt;
      &lt;td&gt;3116 MB/s&lt;/td&gt;
      &lt;td&gt;61608971&lt;/td&gt;
      &lt;td&gt;61.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;55 MB/s&lt;/td&gt;
      &lt;td&gt;309 MB/s&lt;/td&gt;
      &lt;td&gt;52928473&lt;/td&gt;
      &lt;td&gt;52.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;28 MB/s&lt;/td&gt;
      &lt;td&gt;328 MB/s&lt;/td&gt;
      &lt;td&gt;49962674&lt;/td&gt;
      &lt;td&gt;49.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;329 MB/s&lt;/td&gt;
      &lt;td&gt;49860696&lt;/td&gt;
      &lt;td&gt;49.81&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;377 MB/s&lt;/td&gt;
      &lt;td&gt;710 MB/s&lt;/td&gt;
      &lt;td&gt;53079608&lt;/td&gt;
      &lt;td&gt;53.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;298 MB/s&lt;/td&gt;
      &lt;td&gt;648 MB/s&lt;/td&gt;
      &lt;td&gt;51425209&lt;/td&gt;
      &lt;td&gt;51.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;110 MB/s&lt;/td&gt;
      &lt;td&gt;604 MB/s&lt;/td&gt;
      &lt;td&gt;48827923&lt;/td&gt;
      &lt;td&gt;48.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;36 MB/s&lt;/td&gt;
      &lt;td&gt;644 MB/s&lt;/td&gt;
      &lt;td&gt;46859280&lt;/td&gt;
      &lt;td&gt;46.81&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;644 MB/s&lt;/td&gt;
      &lt;td&gt;46356567&lt;/td&gt;
      &lt;td&gt;46.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;7.83 MB/s&lt;/td&gt;
      &lt;td&gt;643 MB/s&lt;/td&gt;
      &lt;td&gt;45814107&lt;/td&gt;
      &lt;td&gt;45.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;1.48 MB/s&lt;/td&gt;
      &lt;td&gt;849 MB/s&lt;/td&gt;
      &lt;td&gt;35601905&lt;/td&gt;
      &lt;td&gt;35.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;389 MB/s&lt;/td&gt;
      &lt;td&gt;1342 MB/s&lt;/td&gt;
      &lt;td&gt;58260187&lt;/td&gt;
      &lt;td&gt;58.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;194 MB/s&lt;/td&gt;
      &lt;td&gt;1246 MB/s&lt;/td&gt;
      &lt;td&gt;65416104&lt;/td&gt;
      &lt;td&gt;65.35&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;38 MB/s&lt;/td&gt;
      &lt;td&gt;525 MB/s&lt;/td&gt;
      &lt;td&gt;52250313&lt;/td&gt;
      &lt;td&gt;52.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

</description>
                <link>http://ConorStokes.github.io/compression/2016/02/24/compressor-improvements-and-lzsse2-vs-lzsse8</link>
                <guid>http://ConorStokes.github.io/compression/2016/02/24/compressor-improvements-and-lzsse2-vs-lzsse8</guid>
                <pubDate>2016-02-24T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>An LZ Codec Designed for SSE Decompression</title>
                <description>
&lt;p&gt;For quite some time, I’ve been keenly following developments in the world of compression, reading blog posts and lurking in forums. It’s always been something I’ve found interesting, but I haven’t really had much practical experience implementing general purpose compressors (most of the things I’ve done have been quite special purpose). I had a few weeks off over the Christmas break, so I decided to have a play with some fairly traditional LZ77/LZSS compressors, just to familiarize myself a bit with details of the implementation.&lt;/p&gt;

&lt;p&gt;The work done over the break was fairly simplistic and well trodden ground. Sometimes it’s good just to instrument code like this, using simple histograms that you can read in the debugger/dump to the console and get a feel for what’s going on. Experimenting a little, trying a few things and building up more of an understanding.&lt;/p&gt;

&lt;p&gt;About two weeks ago a few ideas clicked together and I decided to start a new experiment, building an SSE/x64 oriented &lt;a href=&quot;https://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Storer%E2%80%93Szymanski&quot;&gt;LZSS&lt;/a&gt; format, with a decoder that can branchlessly decode up-to 32 matches per iteration, with a fair bit of the upfront logic done in parallel using SIMD. This is what I’ll be sharing in this blog post, along with associated code for three variants (LZSSE2, LZSSE4 and LZSSE8).&lt;/p&gt;

&lt;p&gt;Note, this is an experiment mainly focused on the decompression, the compressors I’ve implemented aren’t great in terms of speed yet, because I haven’t really put any focus on optimizing them (not being the goal of the experiment). The LZSSE4 and LZSSE8 of the compressors aren’t too slow, but the LZSSE2 compressor is. It uses an &lt;a href=&quot;http://www.cbloom.com/algs/dictionary.html#optimal&quot;&gt;optimal parse&lt;/a&gt; to test the compression levels achievable with the format, but the binary tree based matching it uses has some terrible pathological cases.&lt;/p&gt;

&lt;p&gt;The ideas that clicked together were the threshold based encoding talked about by Charles Bloom &lt;a href=&quot;http://cbloomrants.blogspot.com.au/2012/09/09-02-12-encoding-values-in-bytes-part-2.html&quot;&gt;here&lt;/a&gt;, the way Yann Collet’s &lt;a href=&quot;https://github.com/Cyan4973/lz4/blob/master/lz4_Block_format.md&quot;&gt;LZ4 block format&lt;/a&gt; uses the highest value in fields to do variable length encoding and the way parallel SSE pop count implementations split apart the high and low nibbles of bytes and then use them to look-up values inside a register using the PSHUFB instruction (note, only LZSSE8 actually uses the PSHUFB to implement the logic I was originally thinking about, the other variants use binary logic).&lt;/p&gt;

&lt;h2 id=&quot;format-overview&quot;&gt;Format Overview&lt;/h2&gt;
&lt;p&gt;The three formats implemented have a lot in common. They all use 32 nibble control words packed continuously in the stream, followed by either the offsets or literals for each word. Each nibble either flags a sequence of literals, or a match, based on a threshold. The length for the sequence of literals is encoded if below the threshold, the length of the match is encoded if above. When the nibble is set to 15, that indicates that the following nibble extends the match (and can’t encode literals). I’ve also used a small 64k window, with fixed 16 bit offsets. Each stream also must end with 16 literals (which are not encoded with controls).&lt;/p&gt;

&lt;p&gt;One of the goals is that each control word maps to at most one SSE register width worth of data to copy, so that we don’t need an inner loop (or rep movsb) to copy data. The corresponding challenge, and the reason there are three variants, is trying to get each step in the decoding loop to shift as many bytes as possible on average to keep performance high (which goes hand in hand with compression ratios, as it reduces the relative overhead of the control nibbles).&lt;/p&gt;

&lt;p&gt;In LZSSE2, the control values 0 and 1 represent a sequence of 1 and 2 literals respectively, while the control values 2 through to 15 represent a match length of 3 to 16. If the value of the match control is 15, the next nibble represents an additional 0 to 15 bytes that will be appended to the match (and the same with the next nibble after that and so on). This means that each literal has an overhead of either 2 or 4 bits, but that we can represent shorter matches (3 to 15 bytes) in 20 bits. These kind of matches tend to be quite common in a lot of data, especially text. The overhead for longer matches means we limit the maximal achievable compression ratio to a limit approaching 30x. Because there are only a couple of literals per control, this format isn’t great for data that doesn’t have a lot of matches, or that has long strings of literals between matches.&lt;/p&gt;

&lt;p&gt;In LZSSE4, the control values 0 through to 3 represent sequences of 1 to 4 literals and the control values 4 through 15 represent matches of 4 to 15 bytes, but otherwise the format is the same. This format does better with longer strings of literals and is also more suitable to be paired up with a faster/lower ratio compressor. The longer minimum match length works better with less exhaustive hash based matching.&lt;/p&gt;

&lt;p&gt;LZSSE8 is aimed at lower compression scenarios with more literals again, the control values 0 to 7 represent runs of 1 to 8 literals and the control values 8 to 15 represent matches of 4 to 11 bytes. Also, LZSSE8 needs match offsets greater than 8 bytes from the current cursor (LZSSE8 still beats LZSSE4 on some files in compression ratio, despite the extra restrictions). Again, other than that, the format is the same.&lt;/p&gt;

&lt;p&gt;Offsets and literals use an xor encoding, where offsets are xor’d against the previously read offset and literals are xor’d against the data at the previous match offset in the decompressed stream. This allows us to do some optimizations that we’ll talk about later on.&lt;/p&gt;

&lt;p&gt;We also restrict the kind of overlapping matches allowed. Matches are only allowed to overlap if the offset is greater than one SSE register width away from the current output cursor.&lt;/p&gt;

&lt;h2 id=&quot;the-compressors&quot;&gt;The Compressors&lt;/h2&gt;
&lt;p&gt;The compressor for LZSSE2 uses a variant of the Storer-Szymanski optimal parse algorithm and a binary search tree for finding matches. The implementation is quite naive, but apart from quirks with short offsets, it should always find the longest match. It does have some pathological &lt;em&gt;binary tree problems&lt;/em&gt; when you have long runs of the same character, a well known problem, so some files compress &lt;em&gt;very&lt;/em&gt; slowly. At it’s maximum level, it should achieve the best possible compression for this format (although, there are some caveats with very small offsets). Note that this slow performance is not indicative of anything inherent in LZSSE2, a better matching algorithm would allow the codec to be competitive for compression speed.&lt;/p&gt;

&lt;p&gt;The LZSSE4 and LZSSE8 compressors uses a single entry hash and a greedy parse, they’re designed to be sloppy and fast. That said, there are some files where matches are rare enough that the sloppy matching/parses of LZSSE8 actually beat the LZSSE2 optimal parse on compression ratio.&lt;/p&gt;

&lt;p&gt;Neither is particularly optimized for speed at the moment (although, SSE is used for testing matches). These are basically built for testing out the performance of the format and the decompression implementations.&lt;/p&gt;

&lt;h2 id=&quot;the-decompression-implementation&quot;&gt;The Decompression Implementation&lt;/h2&gt;
&lt;p&gt;This is where things get interesting. Firstly, a comment on this code; it uses macros and gotos, which are things that I wouldn’t usually recommend. It also has largish unrolled loops, which aren’t always wise (but work well in this case). Finally, it’s quite tricky to follow and beaten to make the compiler (in this case, Visual Studio 2015; note, this code has not been tested yet with any other compiler and is definitely not ready for them yet) do what I want, which is no register spills and some quite specific instructions being generated (with an eye on the assembly listings). It’s also some of the code I’ve had the most fun writing in a long time, because it was a &lt;a href=&quot;https://en.wikipedia.org/wiki/House_(TV_series)&quot;&gt;good puzzle&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s also important to note, this code is targeted at 64bit/SSE 4.1 and it eats pretty much all of the registers (and narrowly avoids spills). You’d probably want to do the implementation differently for targeting 32bit x86. I’m sure there are some wins to be had in the implementation. You could definitely trim the implementations back to only require SSSE3 (needed for the 8 bit variable shuffle) though, if you were keen (extracts and blends are fairly simple to emulate with SSE2 instructions).&lt;/p&gt;

&lt;p&gt;One of the first things you might notice is that the main loop is implemented 3 times. The first loop has buffer checks for under-flowing the output buffer based on matches before the data. The second loop doesn’t have buffer checks and the third loop has both the underflow checks and overflow checks for the input and output buffers. The loops themselves have conditions on them that mean it’s impossible to overflow/underflow in the particular loop innards, because they are a “safe” distance away.&lt;/p&gt;

&lt;p&gt;We’ll focus on the LZSSE2 implementation, because it’s a little bit simpler to explain. LZSSE4 and 8 are well commented though, so it should be possible to grok what’s going on.&lt;/p&gt;

&lt;p&gt;Each iteration of the loop deals with 32 control nibbles, which is exactly what fits in one SSE register. We load that at the start of the loop, then split it into high and low nibbles:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i controlBlock = _mm_loadu_si128( reinterpret_cast&amp;lt;const __m128i*&amp;gt;( inputCursor ) );
__m128i controlHi    = _mm_and_si128( _mm_srli_epi32( controlBlock, CONTROL_BITS ), nibbleMask );
__m128i controlLo    = _mm_and_si128( controlBlock, nibbleMask );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then we threshold the control values to work out which is a literal or match (note, later this will possibly be ignored in the event of an extended match):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i isLiteralHi = _mm_cmplt_epi8( controlHi, literalsPerControl );
__m128i isLiteralLo = _mm_cmplt_epi8( controlLo, literalsPerControl );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We also work out if the controls will cause the next control to be an extended match. We call this the “carry”, because it essentially shifts up to the next control.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i carryLo = _mm_cmpeq_epi8( controlLo, nibbleMask );
__m128i carryHi = _mm_cmpeq_epi8( controlHi, nibbleMask );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now, the low carry will be used with the high controls and the high carry will be used with the low controls, but we’ll need to shift the high carry along one to be used with the low controls &lt;em&gt;after&lt;/em&gt; the high ones. Because this would leave a gap of one, we also need a memory to remember the previous set of high carries.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i shiftedCarryHi = _mm_alignr_epi8( carryHi, previousCarryHi, 15 );

previousCarryHi = carryHi;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next, we’ll calculate the number of bytes that we’ll be outputting per control. To do this, we take the control and add one to it if the carry is not set. We actually use a subtraction of negative one, because SSE masks are the same as negative one. Note, in LZSSE8 the bytes out and bytes read stages are done via a lookup using the PSHUFB, where the values are stored in the high and low values of a register.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i bytesOutLo = _mm_sub_epi8( controlLo, _mm_xor_si128( shiftedCarryHi, allSet ) );
__m128i bytesOutHi = _mm_sub_epi8( controlHi, _mm_xor_si128( carryLo, allSet ) );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now we’ll calculate how many extra bytes we’re going to read from the input stream for each control. That will either be two for matches (the size of the offset), one or two for literals and zero for extended matches (when the carry is set). Note that the “literalsPerControl” value here is two, so we’re re-using it.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i streamBytesReadLo = _mm_andnot_si128( shiftedCarryHi, _mm_min_epi8( literalsPerControl, bytesOutLo ) );
__m128i streamBytesReadHi = _mm_andnot_si128( carryLo, _mm_min_epi8( literalsPerControl, bytesOutHi ) );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This is followed by simple masks for whether we’re going to update the offset value (we will for initial matches, we won’t for literals or the extended match) and whether we are writing out literal data or match data:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i readOffsetLo = _mm_xor_si128( _mm_or_si128( isLiteralLo, shiftedCarryHi ), allSet );
__m128i readOffsetHi = _mm_xor_si128( _mm_or_si128( isLiteralHi, carryLo ), allSet );

__m128i fromLiteralLo = _mm_andnot_si128( shiftedCarryHi, isLiteralLo );
__m128i fromLiteralHi = _mm_andnot_si128( carryLo, isLiteralHi );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After this point, we’re going to need some of these values in general purpose registers instead of SSE registers, so we read read out the bottom 64 bits (we’ll read out the top 64 bits in a second version of this later). In fact, when we do the step for handling each individual control, we’ll read the bottom 8 bits of these registers, then shift them 8 bits along (we’ll avoid angering the partial register stall demon by getting the compiler to generate sign and zero extension instructions).&lt;/p&gt;

&lt;p&gt;Speaking of which, this is implemented with macros (because we do it 32 times in a loop), but now we’ll get on to the step for an individual control decoding (we’ll not include the buffer checks used in some loops). Here we  show the step for low controls, high is very similar. Low and high steps are interleaved.&lt;/p&gt;

&lt;p&gt;Part of the goal here is to provide enough interleaved chains of instructions that the compiler always has something to chew on, especially when we have to eat some latency on reads and writes.&lt;/p&gt;

&lt;p&gt;First we read from the input stream (we’re doing this unconditionally to avoid a branch). We treat it as a 16 bit integer and then zero-extend it to size_t and load it into an SSE register. Note, there will be some latency between the two in the time the value takes to come from the (hopefully) L1 cache. We also load the value into an SSE register to be used as literals:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;size_t  inputWord = *reinterpret_cast&amp;lt;const uint16_t*&amp;gt;( inputCursor );                                                  
__m128i literals  = _mm_cvtsi64_si128( inputWord );                                                                      
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next, there is this beauty/monstrosity, which takes the bottom 8 bits of the “readOffsetLo” mask that we’ve copied into a GPR, sign extends it, converts it back to an unsigned integer, uses it to mask the inputWord, which could potentially be the offset, which is then xor’d with the previous offset. This will select the previous offset or update to the new offset, without a branch, and ends up being quicker than a mask and a cmov instruction, because it’s a shorter dependency chain from the load on the input word. This is why we require the offset to be pre-xor’d with the previous offset in the compression stage.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;offset ^= static_cast&amp;lt;size_t&amp;gt;( static_cast&amp;lt;ptrdiff_t&amp;gt;( static_cast&amp;lt;int8_t&amp;gt;( readOffsetHalfLo ) ) ) &amp;amp; inputWord;   
                                                                                           
readOffsetHalfLo &amp;gt;&amp;gt;= 8;    
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here we broadcast the low byte of the from literal register (which we’re also shifting right by one byte each step) to get a mask across the entire width of a register:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i fromLiteral = _mm_shuffle_epi8( fromLiteralLo, _mm_setzero_si128() );                                       

fromLiteralLo   = _mm_srli_si128( fromLiteralLo, 1 );                                                           
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Load the match data:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;const uint8_t* matchPointer = reinterpret_cast&amp;lt;const uint8_t*&amp;gt;( outputCursor - offset );

__m128i matchData = _mm_loadu_si128( reinterpret_cast&amp;lt;const __m128i*&amp;gt;( matchPointer ) );                      
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mask out the literals if we are doing a match and xor them against the potential match data. Note, the literals have been xor’d previously against the match data, so this is essentially an operation choosing between the literals and the match data. Then we’ll store the data to the output, note we’re always storing 16 bytes, regardless of the length of the actual output.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;literals = _mm_and_si128( fromLiteral, literals );                                                                      

__m128i toStore = _mm_xor_si128( matchData, literals );   

_mm_storeu_si128( reinterpret_cast&amp;lt;__m128i*&amp;gt;( outputCursor ), toStore );                                              
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Finally, we bump along the input and output streams:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;outputCursor += static_cast&amp;lt; uint8_t &amp;gt;( bytesOutHalfLo );
inputCursor  += static_cast&amp;lt; uint8_t &amp;gt;( streamBytesReadHalfLo );                                                    
                                                                                                                            
bytesOutHalfLo        &amp;gt;&amp;gt;= 8;                                                                                        
streamBytesReadHalfLo &amp;gt;&amp;gt;= 8;       
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here’s a direct link to the &lt;a href=&quot;https://github.com/ConorStokes/LZSSE/blob/master/lzsse2/lzsse2.cpp&quot;&gt;code&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;
&lt;p&gt;To compare this to other similar codecs, I needed some benchmarks. To do this, I quickly ported &lt;a href=&quot;https://github.com/inikep/lzbench&quot;&gt;lzbench&lt;/a&gt; to Visual Studio, dropping any codec I couldn’t easily get to compile. The changes required to get lzbench working with Visual Studio were fairly minor. The benchmarks here will be enwik8, because there are lots of publicly available results in the &lt;a href=&quot;http://mattmahoney.net/dc/text.html&quot;&gt;Large Text Compression Benchmark&lt;/a&gt; and the Silesia corpus (both as a tarball and the individual components). Note that we’ll mainly focus on decompression speed vs compression ratio here, because that’s the main target of this experiment at the moment. There is also a smaller benchmark done on enwik9, with competing codecs other than LZ4 variants dropped because enwik9 is a much larger file and ran out of benchmarking time. The specific machine used was a Haswell i7 4790 at stock clocks, running Windows 10 64 bit.&lt;/p&gt;

&lt;p&gt;Here’s the results for enwik8, along with all the other compressors that would work with the Visual Studio lzbench build. LZSSE does very well on relatively compressible text like this, which will be one of the common themes in the results. LZSSE2 with the optimal parse provides particularly fast decompression relative to decompression ratio on these kind of files.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11392 MB/s&lt;/td&gt;
      &lt;td&gt;11411 MB/s&lt;/td&gt;
      &lt;td&gt;100000000&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1097 MB/s&lt;/td&gt;
      &lt;td&gt;11492 MB/s&lt;/td&gt;
      &lt;td&gt;100000000&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;567 MB/s&lt;/td&gt;
      &lt;td&gt;11348 MB/s&lt;/td&gt;
      &lt;td&gt;99889340&lt;/td&gt;
      &lt;td&gt;99.89&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;212 MB/s&lt;/td&gt;
      &lt;td&gt;758 MB/s&lt;/td&gt;
      &lt;td&gt;55174611&lt;/td&gt;
      &lt;td&gt;55.17&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;213 MB/s&lt;/td&gt;
      &lt;td&gt;760 MB/s&lt;/td&gt;
      &lt;td&gt;55123815&lt;/td&gt;
      &lt;td&gt;55.12&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;95 MB/s&lt;/td&gt;
      &lt;td&gt;148 MB/s&lt;/td&gt;
      &lt;td&gt;43196165&lt;/td&gt;
      &lt;td&gt;43.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;44 MB/s&lt;/td&gt;
      &lt;td&gt;235 MB/s&lt;/td&gt;
      &lt;td&gt;37294882&lt;/td&gt;
      &lt;td&gt;37.29&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;3.03 MB/s&lt;/td&gt;
      &lt;td&gt;262 MB/s&lt;/td&gt;
      &lt;td&gt;32847751&lt;/td&gt;
      &lt;td&gt;32.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;0.62 MB/s&lt;/td&gt;
      &lt;td&gt;268 MB/s&lt;/td&gt;
      &lt;td&gt;31699549&lt;/td&gt;
      &lt;td&gt;31.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;249 MB/s&lt;/td&gt;
      &lt;td&gt;512 MB/s&lt;/td&gt;
      &lt;td&gt;55239233&lt;/td&gt;
      &lt;td&gt;55.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;228 MB/s&lt;/td&gt;
      &lt;td&gt;501 MB/s&lt;/td&gt;
      &lt;td&gt;54163013&lt;/td&gt;
      &lt;td&gt;54.16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;440 MB/s&lt;/td&gt;
      &lt;td&gt;2623 MB/s&lt;/td&gt;
      &lt;td&gt;57262281&lt;/td&gt;
      &lt;td&gt;57.26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;522 MB/s&lt;/td&gt;
      &lt;td&gt;2525 MB/s&lt;/td&gt;
      &lt;td&gt;63557747&lt;/td&gt;
      &lt;td&gt;63.56&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1157 MB/s&lt;/td&gt;
      &lt;td&gt;3916 MB/s&lt;/td&gt;
      &lt;td&gt;86208275&lt;/td&gt;
      &lt;td&gt;86.21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;119 MB/s&lt;/td&gt;
      &lt;td&gt;2389 MB/s&lt;/td&gt;
      &lt;td&gt;48870227&lt;/td&gt;
      &lt;td&gt;48.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;63 MB/s&lt;/td&gt;
      &lt;td&gt;2560 MB/s&lt;/td&gt;
      &lt;td&gt;43399178&lt;/td&gt;
      &lt;td&gt;43.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;33 MB/s&lt;/td&gt;
      &lt;td&gt;2612 MB/s&lt;/td&gt;
      &lt;td&gt;42210185&lt;/td&gt;
      &lt;td&gt;42.21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;31 MB/s&lt;/td&gt;
      &lt;td&gt;2591 MB/s&lt;/td&gt;
      &lt;td&gt;42196886&lt;/td&gt;
      &lt;td&gt;42.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;31 MB/s&lt;/td&gt;
      &lt;td&gt;2605 MB/s&lt;/td&gt;
      &lt;td&gt;42196873&lt;/td&gt;
      &lt;td&gt;42.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;238 MB/s&lt;/td&gt;
      &lt;td&gt;542 MB/s&lt;/td&gt;
      &lt;td&gt;57695415&lt;/td&gt;
      &lt;td&gt;57.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;243 MB/s&lt;/td&gt;
      &lt;td&gt;576 MB/s&lt;/td&gt;
      &lt;td&gt;53945381&lt;/td&gt;
      &lt;td&gt;53.95&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;63 MB/s&lt;/td&gt;
      &lt;td&gt;439 MB/s&lt;/td&gt;
      &lt;td&gt;61116518&lt;/td&gt;
      &lt;td&gt;61.12&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;36 MB/s&lt;/td&gt;
      &lt;td&gt;433 MB/s&lt;/td&gt;
      &lt;td&gt;54351710&lt;/td&gt;
      &lt;td&gt;54.35&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;459 MB/s&lt;/td&gt;
      &lt;td&gt;50253081&lt;/td&gt;
      &lt;td&gt;50.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;6.13 MB/s&lt;/td&gt;
      &lt;td&gt;517 MB/s&lt;/td&gt;
      &lt;td&gt;46199002&lt;/td&gt;
      &lt;td&gt;46.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;8.68 MB/s&lt;/td&gt;
      &lt;td&gt;183 MB/s&lt;/td&gt;
      &lt;td&gt;37932690&lt;/td&gt;
      &lt;td&gt;37.93&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.48 MB/s&lt;/td&gt;
      &lt;td&gt;265 MB/s&lt;/td&gt;
      &lt;td&gt;29545382&lt;/td&gt;
      &lt;td&gt;29.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;239 MB/s&lt;/td&gt;
      &lt;td&gt;418 MB/s&lt;/td&gt;
      &lt;td&gt;68711273&lt;/td&gt;
      &lt;td&gt;68.71&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;62 MB/s&lt;/td&gt;
      &lt;td&gt;36836091&lt;/td&gt;
      &lt;td&gt;36.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;75 MB/s&lt;/td&gt;
      &lt;td&gt;33411186&lt;/td&gt;
      &lt;td&gt;33.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;9.86 MB/s&lt;/td&gt;
      &lt;td&gt;82 MB/s&lt;/td&gt;
      &lt;td&gt;32197921&lt;/td&gt;
      &lt;td&gt;32.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;1.71 MB/s&lt;/td&gt;
      &lt;td&gt;99 MB/s&lt;/td&gt;
      &lt;td&gt;25895800&lt;/td&gt;
      &lt;td&gt;25.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;228 MB/s&lt;/td&gt;
      &lt;td&gt;427 MB/s&lt;/td&gt;
      &lt;td&gt;59669043&lt;/td&gt;
      &lt;td&gt;59.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;217 MB/s&lt;/td&gt;
      &lt;td&gt;484 MB/s&lt;/td&gt;
      &lt;td&gt;59448006&lt;/td&gt;
      &lt;td&gt;59.45&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;235 MB/s&lt;/td&gt;
      &lt;td&gt;489 MB/s&lt;/td&gt;
      &lt;td&gt;55312164&lt;/td&gt;
      &lt;td&gt;55.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;251 MB/s&lt;/td&gt;
      &lt;td&gt;458 MB/s&lt;/td&gt;
      &lt;td&gt;52468327&lt;/td&gt;
      &lt;td&gt;52.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;123 MB/s&lt;/td&gt;
      &lt;td&gt;467 MB/s&lt;/td&gt;
      &lt;td&gt;47874203&lt;/td&gt;
      &lt;td&gt;47.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;212 MB/s&lt;/td&gt;
      &lt;td&gt;3128 MB/s&lt;/td&gt;
      &lt;td&gt;47108403&lt;/td&gt;
      &lt;td&gt;47.11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;214 MB/s&lt;/td&gt;
      &lt;td&gt;3107 MB/s&lt;/td&gt;
      &lt;td&gt;47249359&lt;/td&gt;
      &lt;td&gt;47.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;2.88 MB/s&lt;/td&gt;
      &lt;td&gt;3759 MB/s&lt;/td&gt;
      &lt;td&gt;38060594&lt;/td&gt;
      &lt;td&gt;38.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;328 MB/s&lt;/td&gt;
      &lt;td&gt;515 MB/s&lt;/td&gt;
      &lt;td&gt;52334371&lt;/td&gt;
      &lt;td&gt;52.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;168 MB/s&lt;/td&gt;
      &lt;td&gt;497 MB/s&lt;/td&gt;
      &lt;td&gt;45883075&lt;/td&gt;
      &lt;td&gt;45.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;43 MB/s&lt;/td&gt;
      &lt;td&gt;689 MB/s&lt;/td&gt;
      &lt;td&gt;44789793&lt;/td&gt;
      &lt;td&gt;44.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;71 MB/s&lt;/td&gt;
      &lt;td&gt;326 MB/s&lt;/td&gt;
      &lt;td&gt;53016707&lt;/td&gt;
      &lt;td&gt;53.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;47 MB/s&lt;/td&gt;
      &lt;td&gt;342 MB/s&lt;/td&gt;
      &lt;td&gt;48214192&lt;/td&gt;
      &lt;td&gt;48.21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;29 MB/s&lt;/td&gt;
      &lt;td&gt;334 MB/s&lt;/td&gt;
      &lt;td&gt;46089022&lt;/td&gt;
      &lt;td&gt;46.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;324 MB/s&lt;/td&gt;
      &lt;td&gt;44959032&lt;/td&gt;
      &lt;td&gt;44.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;117 MB/s&lt;/td&gt;
      &lt;td&gt;1767 MB/s&lt;/td&gt;
      &lt;td&gt;54965417&lt;/td&gt;
      &lt;td&gt;54.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;95 MB/s&lt;/td&gt;
      &lt;td&gt;1811 MB/s&lt;/td&gt;
      &lt;td&gt;53844726&lt;/td&gt;
      &lt;td&gt;53.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;88 MB/s&lt;/td&gt;
      &lt;td&gt;1817 MB/s&lt;/td&gt;
      &lt;td&gt;53654121&lt;/td&gt;
      &lt;td&gt;53.65&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;65 MB/s&lt;/td&gt;
      &lt;td&gt;303 MB/s&lt;/td&gt;
      &lt;td&gt;42298774&lt;/td&gt;
      &lt;td&gt;42.30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;309 MB/s&lt;/td&gt;
      &lt;td&gt;36548921&lt;/td&gt;
      &lt;td&gt;36.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;308 MB/s&lt;/td&gt;
      &lt;td&gt;36475792&lt;/td&gt;
      &lt;td&gt;36.48&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;262 MB/s&lt;/td&gt;
      &lt;td&gt;493 MB/s&lt;/td&gt;
      &lt;td&gt;40822932&lt;/td&gt;
      &lt;td&gt;40.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;192 MB/s&lt;/td&gt;
      &lt;td&gt;393 MB/s&lt;/td&gt;
      &lt;td&gt;37789941&lt;/td&gt;
      &lt;td&gt;37.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;91 MB/s&lt;/td&gt;
      &lt;td&gt;341 MB/s&lt;/td&gt;
      &lt;td&gt;35228432&lt;/td&gt;
      &lt;td&gt;35.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;25 MB/s&lt;/td&gt;
      &lt;td&gt;382 MB/s&lt;/td&gt;
      &lt;td&gt;31789698&lt;/td&gt;
      &lt;td&gt;31.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;7.98 MB/s&lt;/td&gt;
      &lt;td&gt;382 MB/s&lt;/td&gt;
      &lt;td&gt;30761914&lt;/td&gt;
      &lt;td&gt;30.76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;3.58 MB/s&lt;/td&gt;
      &lt;td&gt;340 MB/s&lt;/td&gt;
      &lt;td&gt;28907539&lt;/td&gt;
      &lt;td&gt;28.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;2.20 MB/s&lt;/td&gt;
      &lt;td&gt;241 MB/s&lt;/td&gt;
      &lt;td&gt;27195437&lt;/td&gt;
      &lt;td&gt;27.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;296 MB/s&lt;/td&gt;
      &lt;td&gt;806 MB/s&lt;/td&gt;
      &lt;td&gt;51493020&lt;/td&gt;
      &lt;td&gt;51.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;193 MB/s&lt;/td&gt;
      &lt;td&gt;740 MB/s&lt;/td&gt;
      &lt;td&gt;63521814&lt;/td&gt;
      &lt;td&gt;63.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;32 MB/s&lt;/td&gt;
      &lt;td&gt;374 MB/s&lt;/td&gt;
      &lt;td&gt;41270839&lt;/td&gt;
      &lt;td&gt;41.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;For some more mixed results, the &lt;a href=&quot;http://sun.aei.polsl.pl/~sdeor/index.php?page=silesia&quot;&gt;silesia corpus&lt;/a&gt; as a tar shows that on quite varied data the decompression speed vs compression ratio is still pretty good. We’ll break these down into the individual components for a little analysis.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11336 MB/s&lt;/td&gt;
      &lt;td&gt;11513 MB/s&lt;/td&gt;
      &lt;td&gt;211948032&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1204 MB/s&lt;/td&gt;
      &lt;td&gt;11317 MB/s&lt;/td&gt;
      &lt;td&gt;211644466&lt;/td&gt;
      &lt;td&gt;99.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;635 MB/s&lt;/td&gt;
      &lt;td&gt;9196 MB/s&lt;/td&gt;
      &lt;td&gt;204503525&lt;/td&gt;
      &lt;td&gt;96.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;299 MB/s&lt;/td&gt;
      &lt;td&gt;1298 MB/s&lt;/td&gt;
      &lt;td&gt;113321280&lt;/td&gt;
      &lt;td&gt;53.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;279 MB/s&lt;/td&gt;
      &lt;td&gt;969 MB/s&lt;/td&gt;
      &lt;td&gt;102813688&lt;/td&gt;
      &lt;td&gt;48.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;127 MB/s&lt;/td&gt;
      &lt;td&gt;209 MB/s&lt;/td&gt;
      &lt;td&gt;81984968&lt;/td&gt;
      &lt;td&gt;38.68&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;39 MB/s&lt;/td&gt;
      &lt;td&gt;285 MB/s&lt;/td&gt;
      &lt;td&gt;73066686&lt;/td&gt;
      &lt;td&gt;34.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;6.22 MB/s&lt;/td&gt;
      &lt;td&gt;320 MB/s&lt;/td&gt;
      &lt;td&gt;66499720&lt;/td&gt;
      &lt;td&gt;31.38&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;0.83 MB/s&lt;/td&gt;
      &lt;td&gt;327 MB/s&lt;/td&gt;
      &lt;td&gt;63751752&lt;/td&gt;
      &lt;td&gt;30.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;305 MB/s&lt;/td&gt;
      &lt;td&gt;728 MB/s&lt;/td&gt;
      &lt;td&gt;104627960&lt;/td&gt;
      &lt;td&gt;49.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;308 MB/s&lt;/td&gt;
      &lt;td&gt;712 MB/s&lt;/td&gt;
      &lt;td&gt;100905960&lt;/td&gt;
      &lt;td&gt;47.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;597 MB/s&lt;/td&gt;
      &lt;td&gt;3022 MB/s&lt;/td&gt;
      &lt;td&gt;100880708&lt;/td&gt;
      &lt;td&gt;47.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;696 MB/s&lt;/td&gt;
      &lt;td&gt;3050 MB/s&lt;/td&gt;
      &lt;td&gt;107066575&lt;/td&gt;
      &lt;td&gt;50.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1072 MB/s&lt;/td&gt;
      &lt;td&gt;3659 MB/s&lt;/td&gt;
      &lt;td&gt;131732847&lt;/td&gt;
      &lt;td&gt;62.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;138 MB/s&lt;/td&gt;
      &lt;td&gt;2743 MB/s&lt;/td&gt;
      &lt;td&gt;89227407&lt;/td&gt;
      &lt;td&gt;42.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;76 MB/s&lt;/td&gt;
      &lt;td&gt;2943 MB/s&lt;/td&gt;
      &lt;td&gt;80485966&lt;/td&gt;
      &lt;td&gt;37.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;32 MB/s&lt;/td&gt;
      &lt;td&gt;3018 MB/s&lt;/td&gt;
      &lt;td&gt;77919239&lt;/td&gt;
      &lt;td&gt;36.76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;25 MB/s&lt;/td&gt;
      &lt;td&gt;3009 MB/s&lt;/td&gt;
      &lt;td&gt;77852883&lt;/td&gt;
      &lt;td&gt;36.73&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;3031 MB/s&lt;/td&gt;
      &lt;td&gt;77841832&lt;/td&gt;
      &lt;td&gt;36.73&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;327 MB/s&lt;/td&gt;
      &lt;td&gt;774 MB/s&lt;/td&gt;
      &lt;td&gt;105681992&lt;/td&gt;
      &lt;td&gt;49.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;328 MB/s&lt;/td&gt;
      &lt;td&gt;791 MB/s&lt;/td&gt;
      &lt;td&gt;102041053&lt;/td&gt;
      &lt;td&gt;48.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;63 MB/s&lt;/td&gt;
      &lt;td&gt;590 MB/s&lt;/td&gt;
      &lt;td&gt;108553615&lt;/td&gt;
      &lt;td&gt;51.22&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;41 MB/s&lt;/td&gt;
      &lt;td&gt;603 MB/s&lt;/td&gt;
      &lt;td&gt;95930522&lt;/td&gt;
      &lt;td&gt;45.26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;25 MB/s&lt;/td&gt;
      &lt;td&gt;639 MB/s&lt;/td&gt;
      &lt;td&gt;89490172&lt;/td&gt;
      &lt;td&gt;42.22&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;9.75 MB/s&lt;/td&gt;
      &lt;td&gt;695 MB/s&lt;/td&gt;
      &lt;td&gt;83606917&lt;/td&gt;
      &lt;td&gt;39.45&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;9.97 MB/s&lt;/td&gt;
      &lt;td&gt;224 MB/s&lt;/td&gt;
      &lt;td&gt;64120667&lt;/td&gt;
      &lt;td&gt;30.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.89 MB/s&lt;/td&gt;
      &lt;td&gt;294 MB/s&lt;/td&gt;
      &lt;td&gt;54759533&lt;/td&gt;
      &lt;td&gt;25.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;308 MB/s&lt;/td&gt;
      &lt;td&gt;539 MB/s&lt;/td&gt;
      &lt;td&gt;122671547&lt;/td&gt;
      &lt;td&gt;57.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;23 MB/s&lt;/td&gt;
      &lt;td&gt;73 MB/s&lt;/td&gt;
      &lt;td&gt;64014180&lt;/td&gt;
      &lt;td&gt;30.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;83 MB/s&lt;/td&gt;
      &lt;td&gt;58868127&lt;/td&gt;
      &lt;td&gt;27.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;90 MB/s&lt;/td&gt;
      &lt;td&gt;57202325&lt;/td&gt;
      &lt;td&gt;26.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;3.05 MB/s&lt;/td&gt;
      &lt;td&gt;98 MB/s&lt;/td&gt;
      &lt;td&gt;49722627&lt;/td&gt;
      &lt;td&gt;23.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;279 MB/s&lt;/td&gt;
      &lt;td&gt;569 MB/s&lt;/td&gt;
      &lt;td&gt;113761751&lt;/td&gt;
      &lt;td&gt;53.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;258 MB/s&lt;/td&gt;
      &lt;td&gt;666 MB/s&lt;/td&gt;
      &lt;td&gt;112344625&lt;/td&gt;
      &lt;td&gt;53.01&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;327 MB/s&lt;/td&gt;
      &lt;td&gt;670 MB/s&lt;/td&gt;
      &lt;td&gt;105422213&lt;/td&gt;
      &lt;td&gt;49.74&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;346 MB/s&lt;/td&gt;
      &lt;td&gt;578 MB/s&lt;/td&gt;
      &lt;td&gt;100128419&lt;/td&gt;
      &lt;td&gt;47.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;149 MB/s&lt;/td&gt;
      &lt;td&gt;611 MB/s&lt;/td&gt;
      &lt;td&gt;90816056&lt;/td&gt;
      &lt;td&gt;42.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;269 MB/s&lt;/td&gt;
      &lt;td&gt;3192 MB/s&lt;/td&gt;
      &lt;td&gt;95918518&lt;/td&gt;
      &lt;td&gt;45.26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;273 MB/s&lt;/td&gt;
      &lt;td&gt;3417 MB/s&lt;/td&gt;
      &lt;td&gt;94938891&lt;/td&gt;
      &lt;td&gt;44.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;0.08 MB/s&lt;/td&gt;
      &lt;td&gt;3604 MB/s&lt;/td&gt;
      &lt;td&gt;75668535&lt;/td&gt;
      &lt;td&gt;35.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;471 MB/s&lt;/td&gt;
      &lt;td&gt;615 MB/s&lt;/td&gt;
      &lt;td&gt;94723809&lt;/td&gt;
      &lt;td&gt;44.69&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;227 MB/s&lt;/td&gt;
      &lt;td&gt;558 MB/s&lt;/td&gt;
      &lt;td&gt;84563229&lt;/td&gt;
      &lt;td&gt;39.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;55 MB/s&lt;/td&gt;
      &lt;td&gt;921 MB/s&lt;/td&gt;
      &lt;td&gt;81821485&lt;/td&gt;
      &lt;td&gt;38.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;84 MB/s&lt;/td&gt;
      &lt;td&gt;488 MB/s&lt;/td&gt;
      &lt;td&gt;93943755&lt;/td&gt;
      &lt;td&gt;44.32&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;54 MB/s&lt;/td&gt;
      &lt;td&gt;494 MB/s&lt;/td&gt;
      &lt;td&gt;87396316&lt;/td&gt;
      &lt;td&gt;41.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;34 MB/s&lt;/td&gt;
      &lt;td&gt;492 MB/s&lt;/td&gt;
      &lt;td&gt;85165013&lt;/td&gt;
      &lt;td&gt;40.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;24 MB/s&lt;/td&gt;
      &lt;td&gt;488 MB/s&lt;/td&gt;
      &lt;td&gt;84061090&lt;/td&gt;
      &lt;td&gt;39.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;140 MB/s&lt;/td&gt;
      &lt;td&gt;2199 MB/s&lt;/td&gt;
      &lt;td&gt;105751224&lt;/td&gt;
      &lt;td&gt;49.89&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;109 MB/s&lt;/td&gt;
      &lt;td&gt;2433 MB/s&lt;/td&gt;
      &lt;td&gt;100018782&lt;/td&gt;
      &lt;td&gt;47.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;79 MB/s&lt;/td&gt;
      &lt;td&gt;2515 MB/s&lt;/td&gt;
      &lt;td&gt;98672575&lt;/td&gt;
      &lt;td&gt;46.56&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;76 MB/s&lt;/td&gt;
      &lt;td&gt;352 MB/s&lt;/td&gt;
      &lt;td&gt;77260018&lt;/td&gt;
      &lt;td&gt;36.45&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;26 MB/s&lt;/td&gt;
      &lt;td&gt;376 MB/s&lt;/td&gt;
      &lt;td&gt;68228464&lt;/td&gt;
      &lt;td&gt;32.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;379 MB/s&lt;/td&gt;
      &lt;td&gt;67643845&lt;/td&gt;
      &lt;td&gt;31.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;348 MB/s&lt;/td&gt;
      &lt;td&gt;603 MB/s&lt;/td&gt;
      &lt;td&gt;73803509&lt;/td&gt;
      &lt;td&gt;34.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;269 MB/s&lt;/td&gt;
      &lt;td&gt;523 MB/s&lt;/td&gt;
      &lt;td&gt;70269474&lt;/td&gt;
      &lt;td&gt;33.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;112 MB/s&lt;/td&gt;
      &lt;td&gt;468 MB/s&lt;/td&gt;
      &lt;td&gt;65419600&lt;/td&gt;
      &lt;td&gt;30.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;34 MB/s&lt;/td&gt;
      &lt;td&gt;507 MB/s&lt;/td&gt;
      &lt;td&gt;60463173&lt;/td&gt;
      &lt;td&gt;28.53&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;513 MB/s&lt;/td&gt;
      &lt;td&gt;58851341&lt;/td&gt;
      &lt;td&gt;27.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;6.10 MB/s&lt;/td&gt;
      &lt;td&gt;505 MB/s&lt;/td&gt;
      &lt;td&gt;56904225&lt;/td&gt;
      &lt;td&gt;26.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;4.04 MB/s&lt;/td&gt;
      &lt;td&gt;449 MB/s&lt;/td&gt;
      &lt;td&gt;56182980&lt;/td&gt;
      &lt;td&gt;26.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;11329 MB/s&lt;/td&gt;
      &lt;td&gt;11290 MB/s&lt;/td&gt;
      &lt;td&gt;211948032&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;259 MB/s&lt;/td&gt;
      &lt;td&gt;1116 MB/s&lt;/td&gt;
      &lt;td&gt;109605178&lt;/td&gt;
      &lt;td&gt;51.71&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;34 MB/s&lt;/td&gt;
      &lt;td&gt;484 MB/s&lt;/td&gt;
      &lt;td&gt;76486014&lt;/td&gt;
      &lt;td&gt;36.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The Dickens file in the corpus is the collective work of Charles Dickens. This kind of fairly compressible text works well with LZSSE2, where relatively long matches mean a lot of copied bytes per step, for relatively good performance. Also, LZSSE2 works well in terms of the probability for control words too, because there are relatively short literal runs per number of matches.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;13905 MB/s&lt;/td&gt;
      &lt;td&gt;13681 MB/s&lt;/td&gt;
      &lt;td&gt;10192446&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1141 MB/s&lt;/td&gt;
      &lt;td&gt;13517 MB/s&lt;/td&gt;
      &lt;td&gt;10192446&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;594 MB/s&lt;/td&gt;
      &lt;td&gt;13886 MB/s&lt;/td&gt;
      &lt;td&gt;10192446&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;209 MB/s&lt;/td&gt;
      &lt;td&gt;1137 MB/s&lt;/td&gt;
      &lt;td&gt;7582534&lt;/td&gt;
      &lt;td&gt;74.39&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;209 MB/s&lt;/td&gt;
      &lt;td&gt;740 MB/s&lt;/td&gt;
      &lt;td&gt;6097250&lt;/td&gt;
      &lt;td&gt;59.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;95 MB/s&lt;/td&gt;
      &lt;td&gt;140 MB/s&lt;/td&gt;
      &lt;td&gt;4647459&lt;/td&gt;
      &lt;td&gt;45.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;51 MB/s&lt;/td&gt;
      &lt;td&gt;233 MB/s&lt;/td&gt;
      &lt;td&gt;4144644&lt;/td&gt;
      &lt;td&gt;40.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;2.44 MB/s&lt;/td&gt;
      &lt;td&gt;280 MB/s&lt;/td&gt;
      &lt;td&gt;3467976&lt;/td&gt;
      &lt;td&gt;34.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;0.33 MB/s&lt;/td&gt;
      &lt;td&gt;290 MB/s&lt;/td&gt;
      &lt;td&gt;3350089&lt;/td&gt;
      &lt;td&gt;32.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;257 MB/s&lt;/td&gt;
      &lt;td&gt;507 MB/s&lt;/td&gt;
      &lt;td&gt;6057734&lt;/td&gt;
      &lt;td&gt;59.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;238 MB/s&lt;/td&gt;
      &lt;td&gt;498 MB/s&lt;/td&gt;
      &lt;td&gt;5995417&lt;/td&gt;
      &lt;td&gt;58.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;394 MB/s&lt;/td&gt;
      &lt;td&gt;2574 MB/s&lt;/td&gt;
      &lt;td&gt;6428742&lt;/td&gt;
      &lt;td&gt;63.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;471 MB/s&lt;/td&gt;
      &lt;td&gt;2484 MB/s&lt;/td&gt;
      &lt;td&gt;7082423&lt;/td&gt;
      &lt;td&gt;69.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1074 MB/s&lt;/td&gt;
      &lt;td&gt;3581 MB/s&lt;/td&gt;
      &lt;td&gt;9215415&lt;/td&gt;
      &lt;td&gt;90.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;115 MB/s&lt;/td&gt;
      &lt;td&gt;2282 MB/s&lt;/td&gt;
      &lt;td&gt;5525869&lt;/td&gt;
      &lt;td&gt;54.22&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;53 MB/s&lt;/td&gt;
      &lt;td&gt;2539 MB/s&lt;/td&gt;
      &lt;td&gt;4684564&lt;/td&gt;
      &lt;td&gt;45.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;2605 MB/s&lt;/td&gt;
      &lt;td&gt;4434445&lt;/td&gt;
      &lt;td&gt;43.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;2579 MB/s&lt;/td&gt;
      &lt;td&gt;4431257&lt;/td&gt;
      &lt;td&gt;43.48&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;2633 MB/s&lt;/td&gt;
      &lt;td&gt;4431257&lt;/td&gt;
      &lt;td&gt;43.48&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;243 MB/s&lt;/td&gt;
      &lt;td&gt;530 MB/s&lt;/td&gt;
      &lt;td&gt;6329084&lt;/td&gt;
      &lt;td&gt;62.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;243 MB/s&lt;/td&gt;
      &lt;td&gt;577 MB/s&lt;/td&gt;
      &lt;td&gt;5850777&lt;/td&gt;
      &lt;td&gt;57.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;57 MB/s&lt;/td&gt;
      &lt;td&gt;380 MB/s&lt;/td&gt;
      &lt;td&gt;6937973&lt;/td&gt;
      &lt;td&gt;68.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;29 MB/s&lt;/td&gt;
      &lt;td&gt;383 MB/s&lt;/td&gt;
      &lt;td&gt;6238963&lt;/td&gt;
      &lt;td&gt;61.21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;448 MB/s&lt;/td&gt;
      &lt;td&gt;5663702&lt;/td&gt;
      &lt;td&gt;55.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;4.54 MB/s&lt;/td&gt;
      &lt;td&gt;557 MB/s&lt;/td&gt;
      &lt;td&gt;5021592&lt;/td&gt;
      &lt;td&gt;49.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;8.31 MB/s&lt;/td&gt;
      &lt;td&gt;178 MB/s&lt;/td&gt;
      &lt;td&gt;4248673&lt;/td&gt;
      &lt;td&gt;41.68&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.59 MB/s&lt;/td&gt;
      &lt;td&gt;288 MB/s&lt;/td&gt;
      &lt;td&gt;3172720&lt;/td&gt;
      &lt;td&gt;31.13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;211 MB/s&lt;/td&gt;
      &lt;td&gt;372 MB/s&lt;/td&gt;
      &lt;td&gt;7728055&lt;/td&gt;
      &lt;td&gt;75.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;61 MB/s&lt;/td&gt;
      &lt;td&gt;4044850&lt;/td&gt;
      &lt;td&gt;39.68&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;77 MB/s&lt;/td&gt;
      &lt;td&gt;3613945&lt;/td&gt;
      &lt;td&gt;35.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;80 MB/s&lt;/td&gt;
      &lt;td&gt;3525850&lt;/td&gt;
      &lt;td&gt;34.59&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;1.84 MB/s&lt;/td&gt;
      &lt;td&gt;107 MB/s&lt;/td&gt;
      &lt;td&gt;2829392&lt;/td&gt;
      &lt;td&gt;27.76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;226 MB/s&lt;/td&gt;
      &lt;td&gt;399 MB/s&lt;/td&gt;
      &lt;td&gt;6595660&lt;/td&gt;
      &lt;td&gt;64.71&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;228 MB/s&lt;/td&gt;
      &lt;td&gt;461 MB/s&lt;/td&gt;
      &lt;td&gt;6590368&lt;/td&gt;
      &lt;td&gt;64.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;233 MB/s&lt;/td&gt;
      &lt;td&gt;494 MB/s&lt;/td&gt;
      &lt;td&gt;6157185&lt;/td&gt;
      &lt;td&gt;60.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;265 MB/s&lt;/td&gt;
      &lt;td&gt;483 MB/s&lt;/td&gt;
      &lt;td&gt;5813134&lt;/td&gt;
      &lt;td&gt;57.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;113 MB/s&lt;/td&gt;
      &lt;td&gt;482 MB/s&lt;/td&gt;
      &lt;td&gt;5128916&lt;/td&gt;
      &lt;td&gt;50.32&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;213 MB/s&lt;/td&gt;
      &lt;td&gt;3017 MB/s&lt;/td&gt;
      &lt;td&gt;5161515&lt;/td&gt;
      &lt;td&gt;50.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;215 MB/s&lt;/td&gt;
      &lt;td&gt;2961 MB/s&lt;/td&gt;
      &lt;td&gt;5174322&lt;/td&gt;
      &lt;td&gt;50.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;2.90 MB/s&lt;/td&gt;
      &lt;td&gt;3941 MB/s&lt;/td&gt;
      &lt;td&gt;3872251&lt;/td&gt;
      &lt;td&gt;37.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;340 MB/s&lt;/td&gt;
      &lt;td&gt;533 MB/s&lt;/td&gt;
      &lt;td&gt;5831353&lt;/td&gt;
      &lt;td&gt;57.21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;162 MB/s&lt;/td&gt;
      &lt;td&gt;480 MB/s&lt;/td&gt;
      &lt;td&gt;4953617&lt;/td&gt;
      &lt;td&gt;48.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;39 MB/s&lt;/td&gt;
      &lt;td&gt;720 MB/s&lt;/td&gt;
      &lt;td&gt;5099490&lt;/td&gt;
      &lt;td&gt;50.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;80 MB/s&lt;/td&gt;
      &lt;td&gt;321 MB/s&lt;/td&gt;
      &lt;td&gt;5634109&lt;/td&gt;
      &lt;td&gt;55.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;51 MB/s&lt;/td&gt;
      &lt;td&gt;341 MB/s&lt;/td&gt;
      &lt;td&gt;5030032&lt;/td&gt;
      &lt;td&gt;49.35&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;35 MB/s&lt;/td&gt;
      &lt;td&gt;348 MB/s&lt;/td&gt;
      &lt;td&gt;4842921&lt;/td&gt;
      &lt;td&gt;47.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;353 MB/s&lt;/td&gt;
      &lt;td&gt;4759454&lt;/td&gt;
      &lt;td&gt;46.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;112 MB/s&lt;/td&gt;
      &lt;td&gt;1460 MB/s&lt;/td&gt;
      &lt;td&gt;6013187&lt;/td&gt;
      &lt;td&gt;59.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;89 MB/s&lt;/td&gt;
      &lt;td&gt;1498 MB/s&lt;/td&gt;
      &lt;td&gt;5872799&lt;/td&gt;
      &lt;td&gt;57.62&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;84 MB/s&lt;/td&gt;
      &lt;td&gt;1505 MB/s&lt;/td&gt;
      &lt;td&gt;5846776&lt;/td&gt;
      &lt;td&gt;57.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;65 MB/s&lt;/td&gt;
      &lt;td&gt;310 MB/s&lt;/td&gt;
      &lt;td&gt;4585618&lt;/td&gt;
      &lt;td&gt;44.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;323 MB/s&lt;/td&gt;
      &lt;td&gt;3871634&lt;/td&gt;
      &lt;td&gt;37.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;325 MB/s&lt;/td&gt;
      &lt;td&gt;3854735&lt;/td&gt;
      &lt;td&gt;37.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;242 MB/s&lt;/td&gt;
      &lt;td&gt;473 MB/s&lt;/td&gt;
      &lt;td&gt;4280491&lt;/td&gt;
      &lt;td&gt;42.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;172 MB/s&lt;/td&gt;
      &lt;td&gt;356 MB/s&lt;/td&gt;
      &lt;td&gt;3910652&lt;/td&gt;
      &lt;td&gt;38.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;90 MB/s&lt;/td&gt;
      &lt;td&gt;322 MB/s&lt;/td&gt;
      &lt;td&gt;3722585&lt;/td&gt;
      &lt;td&gt;36.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;23 MB/s&lt;/td&gt;
      &lt;td&gt;374 MB/s&lt;/td&gt;
      &lt;td&gt;3351613&lt;/td&gt;
      &lt;td&gt;32.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;6.45 MB/s&lt;/td&gt;
      &lt;td&gt;381 MB/s&lt;/td&gt;
      &lt;td&gt;3214233&lt;/td&gt;
      &lt;td&gt;31.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;3.45 MB/s&lt;/td&gt;
      &lt;td&gt;383 MB/s&lt;/td&gt;
      &lt;td&gt;3054092&lt;/td&gt;
      &lt;td&gt;29.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;3.11 MB/s&lt;/td&gt;
      &lt;td&gt;382 MB/s&lt;/td&gt;
      &lt;td&gt;3036816&lt;/td&gt;
      &lt;td&gt;29.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;316 MB/s&lt;/td&gt;
      &lt;td&gt;740 MB/s&lt;/td&gt;
      &lt;td&gt;5903074&lt;/td&gt;
      &lt;td&gt;57.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;189 MB/s&lt;/td&gt;
      &lt;td&gt;671 MB/s&lt;/td&gt;
      &lt;td&gt;7275900&lt;/td&gt;
      &lt;td&gt;71.39&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;23 MB/s&lt;/td&gt;
      &lt;td&gt;380 MB/s&lt;/td&gt;
      &lt;td&gt;4501480&lt;/td&gt;
      &lt;td&gt;44.16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Mozilla is the tarred binaries of the Mozilla 1.0 distribution. Things here aren’t as rosy as we have shorter matches and lots of literal runs, although there are some long runs of the same character. The LZSSE2 compressor hits the pathological case for it’s binary tree based matcher, slowing to an absolute crawl on compression. We’re still competitive with LZ4 HC for compression ratio vs decompression performance.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11349 MB/s&lt;/td&gt;
      &lt;td&gt;11374 MB/s&lt;/td&gt;
      &lt;td&gt;51220480&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1355 MB/s&lt;/td&gt;
      &lt;td&gt;11321 MB/s&lt;/td&gt;
      &lt;td&gt;51220480&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;709 MB/s&lt;/td&gt;
      &lt;td&gt;10787 MB/s&lt;/td&gt;
      &lt;td&gt;50949746&lt;/td&gt;
      &lt;td&gt;99.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;302 MB/s&lt;/td&gt;
      &lt;td&gt;1446 MB/s&lt;/td&gt;
      &lt;td&gt;32729305&lt;/td&gt;
      &lt;td&gt;63.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;282 MB/s&lt;/td&gt;
      &lt;td&gt;938 MB/s&lt;/td&gt;
      &lt;td&gt;27353816&lt;/td&gt;
      &lt;td&gt;53.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;127 MB/s&lt;/td&gt;
      &lt;td&gt;229 MB/s&lt;/td&gt;
      &lt;td&gt;22261084&lt;/td&gt;
      &lt;td&gt;43.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;34 MB/s&lt;/td&gt;
      &lt;td&gt;259 MB/s&lt;/td&gt;
      &lt;td&gt;20573545&lt;/td&gt;
      &lt;td&gt;40.17&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;9.79 MB/s&lt;/td&gt;
      &lt;td&gt;274 MB/s&lt;/td&gt;
      &lt;td&gt;19750089&lt;/td&gt;
      &lt;td&gt;38.56&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;1.51 MB/s&lt;/td&gt;
      &lt;td&gt;283 MB/s&lt;/td&gt;
      &lt;td&gt;18760569&lt;/td&gt;
      &lt;td&gt;36.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;294 MB/s&lt;/td&gt;
      &lt;td&gt;782 MB/s&lt;/td&gt;
      &lt;td&gt;27610306&lt;/td&gt;
      &lt;td&gt;53.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;293 MB/s&lt;/td&gt;
      &lt;td&gt;754 MB/s&lt;/td&gt;
      &lt;td&gt;27070715&lt;/td&gt;
      &lt;td&gt;52.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;637 MB/s&lt;/td&gt;
      &lt;td&gt;2929 MB/s&lt;/td&gt;
      &lt;td&gt;26435667&lt;/td&gt;
      &lt;td&gt;51.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;745 MB/s&lt;/td&gt;
      &lt;td&gt;3019 MB/s&lt;/td&gt;
      &lt;td&gt;27973598&lt;/td&gt;
      &lt;td&gt;54.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1116 MB/s&lt;/td&gt;
      &lt;td&gt;3749 MB/s&lt;/td&gt;
      &lt;td&gt;34039558&lt;/td&gt;
      &lt;td&gt;66.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;132 MB/s&lt;/td&gt;
      &lt;td&gt;2765 MB/s&lt;/td&gt;
      &lt;td&gt;23886540&lt;/td&gt;
      &lt;td&gt;46.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;85 MB/s&lt;/td&gt;
      &lt;td&gt;2982 MB/s&lt;/td&gt;
      &lt;td&gt;22513368&lt;/td&gt;
      &lt;td&gt;43.95&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;44 MB/s&lt;/td&gt;
      &lt;td&gt;3067 MB/s&lt;/td&gt;
      &lt;td&gt;22092109&lt;/td&gt;
      &lt;td&gt;43.13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;28 MB/s&lt;/td&gt;
      &lt;td&gt;3004 MB/s&lt;/td&gt;
      &lt;td&gt;22071142&lt;/td&gt;
      &lt;td&gt;43.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;3017 MB/s&lt;/td&gt;
      &lt;td&gt;22062995&lt;/td&gt;
      &lt;td&gt;43.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;339 MB/s&lt;/td&gt;
      &lt;td&gt;806 MB/s&lt;/td&gt;
      &lt;td&gt;26982485&lt;/td&gt;
      &lt;td&gt;52.68&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;324 MB/s&lt;/td&gt;
      &lt;td&gt;800 MB/s&lt;/td&gt;
      &lt;td&gt;26687518&lt;/td&gt;
      &lt;td&gt;52.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;51 MB/s&lt;/td&gt;
      &lt;td&gt;625 MB/s&lt;/td&gt;
      &lt;td&gt;26280004&lt;/td&gt;
      &lt;td&gt;51.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;40 MB/s&lt;/td&gt;
      &lt;td&gt;631 MB/s&lt;/td&gt;
      &lt;td&gt;24613811&lt;/td&gt;
      &lt;td&gt;48.05&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;29 MB/s&lt;/td&gt;
      &lt;td&gt;634 MB/s&lt;/td&gt;
      &lt;td&gt;23802178&lt;/td&gt;
      &lt;td&gt;46.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;640 MB/s&lt;/td&gt;
      &lt;td&gt;22980170&lt;/td&gt;
      &lt;td&gt;44.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;9.38 MB/s&lt;/td&gt;
      &lt;td&gt;211 MB/s&lt;/td&gt;
      &lt;td&gt;16337459&lt;/td&gt;
      &lt;td&gt;31.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.66 MB/s&lt;/td&gt;
      &lt;td&gt;246 MB/s&lt;/td&gt;
      &lt;td&gt;14749315&lt;/td&gt;
      &lt;td&gt;28.80&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;335 MB/s&lt;/td&gt;
      &lt;td&gt;583 MB/s&lt;/td&gt;
      &lt;td&gt;28867642&lt;/td&gt;
      &lt;td&gt;56.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;22 MB/s&lt;/td&gt;
      &lt;td&gt;65 MB/s&lt;/td&gt;
      &lt;td&gt;16425272&lt;/td&gt;
      &lt;td&gt;32.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;72 MB/s&lt;/td&gt;
      &lt;td&gt;15390824&lt;/td&gt;
      &lt;td&gt;30.05&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;77 MB/s&lt;/td&gt;
      &lt;td&gt;14878636&lt;/td&gt;
      &lt;td&gt;29.05&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;3.12 MB/s&lt;/td&gt;
      &lt;td&gt;82 MB/s&lt;/td&gt;
      &lt;td&gt;13512367&lt;/td&gt;
      &lt;td&gt;26.38&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;295 MB/s&lt;/td&gt;
      &lt;td&gt;622 MB/s&lt;/td&gt;
      &lt;td&gt;27333863&lt;/td&gt;
      &lt;td&gt;53.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;260 MB/s&lt;/td&gt;
      &lt;td&gt;742 MB/s&lt;/td&gt;
      &lt;td&gt;27187667&lt;/td&gt;
      &lt;td&gt;53.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;346 MB/s&lt;/td&gt;
      &lt;td&gt;697 MB/s&lt;/td&gt;
      &lt;td&gt;26210993&lt;/td&gt;
      &lt;td&gt;51.17&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;349 MB/s&lt;/td&gt;
      &lt;td&gt;557 MB/s&lt;/td&gt;
      &lt;td&gt;25578346&lt;/td&gt;
      &lt;td&gt;49.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;154 MB/s&lt;/td&gt;
      &lt;td&gt;570 MB/s&lt;/td&gt;
      &lt;td&gt;24126074&lt;/td&gt;
      &lt;td&gt;47.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;258 MB/s&lt;/td&gt;
      &lt;td&gt;2635 MB/s&lt;/td&gt;
      &lt;td&gt;27406939&lt;/td&gt;
      &lt;td&gt;53.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;262 MB/s&lt;/td&gt;
      &lt;td&gt;2818 MB/s&lt;/td&gt;
      &lt;td&gt;26993974&lt;/td&gt;
      &lt;td&gt;52.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;0.03 MB/s&lt;/td&gt;
      &lt;td&gt;3030 MB/s&lt;/td&gt;
      &lt;td&gt;22452327&lt;/td&gt;
      &lt;td&gt;43.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;478 MB/s&lt;/td&gt;
      &lt;td&gt;579 MB/s&lt;/td&gt;
      &lt;td&gt;24756819&lt;/td&gt;
      &lt;td&gt;48.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;223 MB/s&lt;/td&gt;
      &lt;td&gt;503 MB/s&lt;/td&gt;
      &lt;td&gt;23337850&lt;/td&gt;
      &lt;td&gt;45.56&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;56 MB/s&lt;/td&gt;
      &lt;td&gt;831 MB/s&lt;/td&gt;
      &lt;td&gt;22240936&lt;/td&gt;
      &lt;td&gt;43.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;69 MB/s&lt;/td&gt;
      &lt;td&gt;501 MB/s&lt;/td&gt;
      &lt;td&gt;25454532&lt;/td&gt;
      &lt;td&gt;49.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;46 MB/s&lt;/td&gt;
      &lt;td&gt;491 MB/s&lt;/td&gt;
      &lt;td&gt;24449446&lt;/td&gt;
      &lt;td&gt;47.73&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;30 MB/s&lt;/td&gt;
      &lt;td&gt;490 MB/s&lt;/td&gt;
      &lt;td&gt;24076623&lt;/td&gt;
      &lt;td&gt;47.01&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;483 MB/s&lt;/td&gt;
      &lt;td&gt;23881699&lt;/td&gt;
      &lt;td&gt;46.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;142 MB/s&lt;/td&gt;
      &lt;td&gt;2330 MB/s&lt;/td&gt;
      &lt;td&gt;26958469&lt;/td&gt;
      &lt;td&gt;52.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;109 MB/s&lt;/td&gt;
      &lt;td&gt;2662 MB/s&lt;/td&gt;
      &lt;td&gt;25715135&lt;/td&gt;
      &lt;td&gt;50.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;77 MB/s&lt;/td&gt;
      &lt;td&gt;2707 MB/s&lt;/td&gt;
      &lt;td&gt;25271700&lt;/td&gt;
      &lt;td&gt;49.34&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;66 MB/s&lt;/td&gt;
      &lt;td&gt;317 MB/s&lt;/td&gt;
      &lt;td&gt;20577226&lt;/td&gt;
      &lt;td&gt;40.17&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;23 MB/s&lt;/td&gt;
      &lt;td&gt;336 MB/s&lt;/td&gt;
      &lt;td&gt;19089124&lt;/td&gt;
      &lt;td&gt;37.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;6.36 MB/s&lt;/td&gt;
      &lt;td&gt;339 MB/s&lt;/td&gt;
      &lt;td&gt;19044396&lt;/td&gt;
      &lt;td&gt;37.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;345 MB/s&lt;/td&gt;
      &lt;td&gt;556 MB/s&lt;/td&gt;
      &lt;td&gt;20173050&lt;/td&gt;
      &lt;td&gt;39.38&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;280 MB/s&lt;/td&gt;
      &lt;td&gt;526 MB/s&lt;/td&gt;
      &lt;td&gt;19244936&lt;/td&gt;
      &lt;td&gt;37.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;110 MB/s&lt;/td&gt;
      &lt;td&gt;487 MB/s&lt;/td&gt;
      &lt;td&gt;18239976&lt;/td&gt;
      &lt;td&gt;35.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;37 MB/s&lt;/td&gt;
      &lt;td&gt;518 MB/s&lt;/td&gt;
      &lt;td&gt;17155767&lt;/td&gt;
      &lt;td&gt;33.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;516 MB/s&lt;/td&gt;
      &lt;td&gt;16862530&lt;/td&gt;
      &lt;td&gt;32.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;8.46 MB/s&lt;/td&gt;
      &lt;td&gt;503 MB/s&lt;/td&gt;
      &lt;td&gt;16552487&lt;/td&gt;
      &lt;td&gt;32.32&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;5.83 MB/s&lt;/td&gt;
      &lt;td&gt;435 MB/s&lt;/td&gt;
      &lt;td&gt;16397038&lt;/td&gt;
      &lt;td&gt;32.01&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;397 MB/s&lt;/td&gt;
      &lt;td&gt;1162 MB/s&lt;/td&gt;
      &lt;td&gt;23797180&lt;/td&gt;
      &lt;td&gt;46.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;249 MB/s&lt;/td&gt;
      &lt;td&gt;1270 MB/s&lt;/td&gt;
      &lt;td&gt;28757022&lt;/td&gt;
      &lt;td&gt;56.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;29 MB/s&lt;/td&gt;
      &lt;td&gt;458 MB/s&lt;/td&gt;
      &lt;td&gt;20575801&lt;/td&gt;
      &lt;td&gt;40.17&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Silesia’s mr is a magnetic resonance image. Again, we have pathological compression performance for LZSEE2. LZSSE8 does well here because of the longer literal runs, but LZSEE2’s stronger matching puts it ahead.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;14023 MB/s&lt;/td&gt;
      &lt;td&gt;13695 MB/s&lt;/td&gt;
      &lt;td&gt;9970564&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1531 MB/s&lt;/td&gt;
      &lt;td&gt;13473 MB/s&lt;/td&gt;
      &lt;td&gt;9970564&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;818 MB/s&lt;/td&gt;
      &lt;td&gt;13455 MB/s&lt;/td&gt;
      &lt;td&gt;9970564&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;343 MB/s&lt;/td&gt;
      &lt;td&gt;1081 MB/s&lt;/td&gt;
      &lt;td&gt;5842843&lt;/td&gt;
      &lt;td&gt;58.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;340 MB/s&lt;/td&gt;
      &lt;td&gt;858 MB/s&lt;/td&gt;
      &lt;td&gt;5122078&lt;/td&gt;
      &lt;td&gt;51.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;129 MB/s&lt;/td&gt;
      &lt;td&gt;177 MB/s&lt;/td&gt;
      &lt;td&gt;4393337&lt;/td&gt;
      &lt;td&gt;44.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;51 MB/s&lt;/td&gt;
      &lt;td&gt;280 MB/s&lt;/td&gt;
      &lt;td&gt;4151312&lt;/td&gt;
      &lt;td&gt;41.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;4.74 MB/s&lt;/td&gt;
      &lt;td&gt;312 MB/s&lt;/td&gt;
      &lt;td&gt;3691296&lt;/td&gt;
      &lt;td&gt;37.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;0.42 MB/s&lt;/td&gt;
      &lt;td&gt;301 MB/s&lt;/td&gt;
      &lt;td&gt;3532781&lt;/td&gt;
      &lt;td&gt;35.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;456 MB/s&lt;/td&gt;
      &lt;td&gt;1032 MB/s&lt;/td&gt;
      &lt;td&gt;5102964&lt;/td&gt;
      &lt;td&gt;51.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;375 MB/s&lt;/td&gt;
      &lt;td&gt;1028 MB/s&lt;/td&gt;
      &lt;td&gt;5073384&lt;/td&gt;
      &lt;td&gt;50.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;608 MB/s&lt;/td&gt;
      &lt;td&gt;3157 MB/s&lt;/td&gt;
      &lt;td&gt;5440937&lt;/td&gt;
      &lt;td&gt;54.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;751 MB/s&lt;/td&gt;
      &lt;td&gt;3243 MB/s&lt;/td&gt;
      &lt;td&gt;5590948&lt;/td&gt;
      &lt;td&gt;56.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1100 MB/s&lt;/td&gt;
      &lt;td&gt;3899 MB/s&lt;/td&gt;
      &lt;td&gt;6040318&lt;/td&gt;
      &lt;td&gt;60.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;142 MB/s&lt;/td&gt;
      &lt;td&gt;2558 MB/s&lt;/td&gt;
      &lt;td&gt;5077585&lt;/td&gt;
      &lt;td&gt;50.93&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;68 MB/s&lt;/td&gt;
      &lt;td&gt;2826 MB/s&lt;/td&gt;
      &lt;td&gt;4529845&lt;/td&gt;
      &lt;td&gt;45.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;2965 MB/s&lt;/td&gt;
      &lt;td&gt;4247505&lt;/td&gt;
      &lt;td&gt;42.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;2998 MB/s&lt;/td&gt;
      &lt;td&gt;4244773&lt;/td&gt;
      &lt;td&gt;42.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;4.96 MB/s&lt;/td&gt;
      &lt;td&gt;2970 MB/s&lt;/td&gt;
      &lt;td&gt;4244224&lt;/td&gt;
      &lt;td&gt;42.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;424 MB/s&lt;/td&gt;
      &lt;td&gt;801 MB/s&lt;/td&gt;
      &lt;td&gt;5388536&lt;/td&gt;
      &lt;td&gt;54.04&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;450 MB/s&lt;/td&gt;
      &lt;td&gt;858 MB/s&lt;/td&gt;
      &lt;td&gt;4999202&lt;/td&gt;
      &lt;td&gt;50.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;70 MB/s&lt;/td&gt;
      &lt;td&gt;552 MB/s&lt;/td&gt;
      &lt;td&gt;5494713&lt;/td&gt;
      &lt;td&gt;55.11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;37 MB/s&lt;/td&gt;
      &lt;td&gt;545 MB/s&lt;/td&gt;
      &lt;td&gt;5262984&lt;/td&gt;
      &lt;td&gt;52.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;569 MB/s&lt;/td&gt;
      &lt;td&gt;5056631&lt;/td&gt;
      &lt;td&gt;50.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;6.39 MB/s&lt;/td&gt;
      &lt;td&gt;614 MB/s&lt;/td&gt;
      &lt;td&gt;4807004&lt;/td&gt;
      &lt;td&gt;48.21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;8.64 MB/s&lt;/td&gt;
      &lt;td&gt;176 MB/s&lt;/td&gt;
      &lt;td&gt;3155756&lt;/td&gt;
      &lt;td&gt;31.65&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;3.34 MB/s&lt;/td&gt;
      &lt;td&gt;232 MB/s&lt;/td&gt;
      &lt;td&gt;2985074&lt;/td&gt;
      &lt;td&gt;29.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;336 MB/s&lt;/td&gt;
      &lt;td&gt;633 MB/s&lt;/td&gt;
      &lt;td&gt;5854361&lt;/td&gt;
      &lt;td&gt;58.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;69 MB/s&lt;/td&gt;
      &lt;td&gt;3157626&lt;/td&gt;
      &lt;td&gt;31.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;76 MB/s&lt;/td&gt;
      &lt;td&gt;3092086&lt;/td&gt;
      &lt;td&gt;31.01&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;81 MB/s&lt;/td&gt;
      &lt;td&gt;3040649&lt;/td&gt;
      &lt;td&gt;30.50&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;2.92 MB/s&lt;/td&gt;
      &lt;td&gt;84 MB/s&lt;/td&gt;
      &lt;td&gt;2751595&lt;/td&gt;
      &lt;td&gt;27.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;406 MB/s&lt;/td&gt;
      &lt;td&gt;770 MB/s&lt;/td&gt;
      &lt;td&gt;5492440&lt;/td&gt;
      &lt;td&gt;55.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;383 MB/s&lt;/td&gt;
      &lt;td&gt;970 MB/s&lt;/td&gt;
      &lt;td&gt;5453392&lt;/td&gt;
      &lt;td&gt;54.69&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;470 MB/s&lt;/td&gt;
      &lt;td&gt;960 MB/s&lt;/td&gt;
      &lt;td&gt;5187387&lt;/td&gt;
      &lt;td&gt;52.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;484 MB/s&lt;/td&gt;
      &lt;td&gt;796 MB/s&lt;/td&gt;
      &lt;td&gt;5013906&lt;/td&gt;
      &lt;td&gt;50.29&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;172 MB/s&lt;/td&gt;
      &lt;td&gt;776 MB/s&lt;/td&gt;
      &lt;td&gt;4629636&lt;/td&gt;
      &lt;td&gt;46.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;254 MB/s&lt;/td&gt;
      &lt;td&gt;2589 MB/s&lt;/td&gt;
      &lt;td&gt;7034206&lt;/td&gt;
      &lt;td&gt;70.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;281 MB/s&lt;/td&gt;
      &lt;td&gt;3031 MB/s&lt;/td&gt;
      &lt;td&gt;6856430&lt;/td&gt;
      &lt;td&gt;68.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;0.03 MB/s&lt;/td&gt;
      &lt;td&gt;3315 MB/s&lt;/td&gt;
      &lt;td&gt;4006788&lt;/td&gt;
      &lt;td&gt;40.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;636 MB/s&lt;/td&gt;
      &lt;td&gt;526 MB/s&lt;/td&gt;
      &lt;td&gt;4778194&lt;/td&gt;
      &lt;td&gt;47.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;277 MB/s&lt;/td&gt;
      &lt;td&gt;486 MB/s&lt;/td&gt;
      &lt;td&gt;4317635&lt;/td&gt;
      &lt;td&gt;43.30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;56 MB/s&lt;/td&gt;
      &lt;td&gt;956 MB/s&lt;/td&gt;
      &lt;td&gt;4559691&lt;/td&gt;
      &lt;td&gt;45.73&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;79 MB/s&lt;/td&gt;
      &lt;td&gt;484 MB/s&lt;/td&gt;
      &lt;td&gt;5269368&lt;/td&gt;
      &lt;td&gt;52.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;56 MB/s&lt;/td&gt;
      &lt;td&gt;473 MB/s&lt;/td&gt;
      &lt;td&gt;4928226&lt;/td&gt;
      &lt;td&gt;49.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;37 MB/s&lt;/td&gt;
      &lt;td&gt;467 MB/s&lt;/td&gt;
      &lt;td&gt;4792581&lt;/td&gt;
      &lt;td&gt;48.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;28 MB/s&lt;/td&gt;
      &lt;td&gt;468 MB/s&lt;/td&gt;
      &lt;td&gt;4730734&lt;/td&gt;
      &lt;td&gt;47.45&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;142 MB/s&lt;/td&gt;
      &lt;td&gt;1692 MB/s&lt;/td&gt;
      &lt;td&gt;6113745&lt;/td&gt;
      &lt;td&gt;61.32&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;108 MB/s&lt;/td&gt;
      &lt;td&gt;2492 MB/s&lt;/td&gt;
      &lt;td&gt;5258774&lt;/td&gt;
      &lt;td&gt;52.74&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;68 MB/s&lt;/td&gt;
      &lt;td&gt;2903 MB/s&lt;/td&gt;
      &lt;td&gt;5016379&lt;/td&gt;
      &lt;td&gt;50.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;81 MB/s&lt;/td&gt;
      &lt;td&gt;364 MB/s&lt;/td&gt;
      &lt;td&gt;3828366&lt;/td&gt;
      &lt;td&gt;38.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;342 MB/s&lt;/td&gt;
      &lt;td&gt;3675941&lt;/td&gt;
      &lt;td&gt;36.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;6.01 MB/s&lt;/td&gt;
      &lt;td&gt;354 MB/s&lt;/td&gt;
      &lt;td&gt;3660794&lt;/td&gt;
      &lt;td&gt;36.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;313 MB/s&lt;/td&gt;
      &lt;td&gt;643 MB/s&lt;/td&gt;
      &lt;td&gt;3832967&lt;/td&gt;
      &lt;td&gt;38.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;229 MB/s&lt;/td&gt;
      &lt;td&gt;493 MB/s&lt;/td&gt;
      &lt;td&gt;3611124&lt;/td&gt;
      &lt;td&gt;36.22&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;98 MB/s&lt;/td&gt;
      &lt;td&gt;373 MB/s&lt;/td&gt;
      &lt;td&gt;3455926&lt;/td&gt;
      &lt;td&gt;34.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;382 MB/s&lt;/td&gt;
      &lt;td&gt;3360748&lt;/td&gt;
      &lt;td&gt;33.71&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;9.32 MB/s&lt;/td&gt;
      &lt;td&gt;388 MB/s&lt;/td&gt;
      &lt;td&gt;3298241&lt;/td&gt;
      &lt;td&gt;33.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;5.19 MB/s&lt;/td&gt;
      &lt;td&gt;382 MB/s&lt;/td&gt;
      &lt;td&gt;3238037&lt;/td&gt;
      &lt;td&gt;32.48&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;4.62 MB/s&lt;/td&gt;
      &lt;td&gt;380 MB/s&lt;/td&gt;
      &lt;td&gt;3232535&lt;/td&gt;
      &lt;td&gt;32.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;440 MB/s&lt;/td&gt;
      &lt;td&gt;938 MB/s&lt;/td&gt;
      &lt;td&gt;5348926&lt;/td&gt;
      &lt;td&gt;53.65&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;317 MB/s&lt;/td&gt;
      &lt;td&gt;1580 MB/s&lt;/td&gt;
      &lt;td&gt;6128033&lt;/td&gt;
      &lt;td&gt;61.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;40 MB/s&lt;/td&gt;
      &lt;td&gt;468 MB/s&lt;/td&gt;
      &lt;td&gt;4211586&lt;/td&gt;
      &lt;td&gt;42.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Silesia’s nci is a database of chemical structures and is highly compressible. LZSSE loves this file, especially LZSSE2, where we get over 60% of memcpy speed for relatively competitive compression ratios (yes, that is over 7GB/s). The main thing here is that we get a lot of bytes copied per step, which increases the relative efficiency of the decompression.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11459 MB/s&lt;/td&gt;
      &lt;td&gt;11455 MB/s&lt;/td&gt;
      &lt;td&gt;33553445&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1122 MB/s&lt;/td&gt;
      &lt;td&gt;11374 MB/s&lt;/td&gt;
      &lt;td&gt;33553445&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;609 MB/s&lt;/td&gt;
      &lt;td&gt;5875 MB/s&lt;/td&gt;
      &lt;td&gt;28744881&lt;/td&gt;
      &lt;td&gt;85.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;588 MB/s&lt;/td&gt;
      &lt;td&gt;1622 MB/s&lt;/td&gt;
      &lt;td&gt;6809799&lt;/td&gt;
      &lt;td&gt;20.30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;589 MB/s&lt;/td&gt;
      &lt;td&gt;1622 MB/s&lt;/td&gt;
      &lt;td&gt;6809799&lt;/td&gt;
      &lt;td&gt;20.30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;246 MB/s&lt;/td&gt;
      &lt;td&gt;392 MB/s&lt;/td&gt;
      &lt;td&gt;4559358&lt;/td&gt;
      &lt;td&gt;13.59&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;132 MB/s&lt;/td&gt;
      &lt;td&gt;643 MB/s&lt;/td&gt;
      &lt;td&gt;3668407&lt;/td&gt;
      &lt;td&gt;10.93&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;848 MB/s&lt;/td&gt;
      &lt;td&gt;2806144&lt;/td&gt;
      &lt;td&gt;8.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;1.97 MB/s&lt;/td&gt;
      &lt;td&gt;912 MB/s&lt;/td&gt;
      &lt;td&gt;2624033&lt;/td&gt;
      &lt;td&gt;7.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;701 MB/s&lt;/td&gt;
      &lt;td&gt;1134 MB/s&lt;/td&gt;
      &lt;td&gt;6947358&lt;/td&gt;
      &lt;td&gt;20.71&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;636 MB/s&lt;/td&gt;
      &lt;td&gt;1117 MB/s&lt;/td&gt;
      &lt;td&gt;6583289&lt;/td&gt;
      &lt;td&gt;19.62&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;1103 MB/s&lt;/td&gt;
      &lt;td&gt;4133 MB/s&lt;/td&gt;
      &lt;td&gt;5533040&lt;/td&gt;
      &lt;td&gt;16.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;1176 MB/s&lt;/td&gt;
      &lt;td&gt;4068 MB/s&lt;/td&gt;
      &lt;td&gt;5684097&lt;/td&gt;
      &lt;td&gt;16.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1295 MB/s&lt;/td&gt;
      &lt;td&gt;3883 MB/s&lt;/td&gt;
      &lt;td&gt;7172738&lt;/td&gt;
      &lt;td&gt;21.38&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;270 MB/s&lt;/td&gt;
      &lt;td&gt;3783 MB/s&lt;/td&gt;
      &lt;td&gt;5059842&lt;/td&gt;
      &lt;td&gt;15.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;132 MB/s&lt;/td&gt;
      &lt;td&gt;4359 MB/s&lt;/td&gt;
      &lt;td&gt;4078371&lt;/td&gt;
      &lt;td&gt;12.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;28 MB/s&lt;/td&gt;
      &lt;td&gt;4758 MB/s&lt;/td&gt;
      &lt;td&gt;3679323&lt;/td&gt;
      &lt;td&gt;10.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;4853 MB/s&lt;/td&gt;
      &lt;td&gt;3662990&lt;/td&gt;
      &lt;td&gt;10.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;4836 MB/s&lt;/td&gt;
      &lt;td&gt;3661231&lt;/td&gt;
      &lt;td&gt;10.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;679 MB/s&lt;/td&gt;
      &lt;td&gt;1458 MB/s&lt;/td&gt;
      &lt;td&gt;7263009&lt;/td&gt;
      &lt;td&gt;21.65&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;691 MB/s&lt;/td&gt;
      &lt;td&gt;1559 MB/s&lt;/td&gt;
      &lt;td&gt;6936021&lt;/td&gt;
      &lt;td&gt;20.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;114 MB/s&lt;/td&gt;
      &lt;td&gt;962 MB/s&lt;/td&gt;
      &lt;td&gt;8218641&lt;/td&gt;
      &lt;td&gt;24.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;72 MB/s&lt;/td&gt;
      &lt;td&gt;1082 MB/s&lt;/td&gt;
      &lt;td&gt;5991131&lt;/td&gt;
      &lt;td&gt;17.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;50 MB/s&lt;/td&gt;
      &lt;td&gt;1186 MB/s&lt;/td&gt;
      &lt;td&gt;5304820&lt;/td&gt;
      &lt;td&gt;15.81&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;1330 MB/s&lt;/td&gt;
      &lt;td&gt;4613756&lt;/td&gt;
      &lt;td&gt;13.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;566 MB/s&lt;/td&gt;
      &lt;td&gt;2813533&lt;/td&gt;
      &lt;td&gt;8.39&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;4.35 MB/s&lt;/td&gt;
      &lt;td&gt;933 MB/s&lt;/td&gt;
      &lt;td&gt;2135880&lt;/td&gt;
      &lt;td&gt;6.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;487 MB/s&lt;/td&gt;
      &lt;td&gt;776 MB/s&lt;/td&gt;
      &lt;td&gt;8714416&lt;/td&gt;
      &lt;td&gt;25.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;56 MB/s&lt;/td&gt;
      &lt;td&gt;242 MB/s&lt;/td&gt;
      &lt;td&gt;2777997&lt;/td&gt;
      &lt;td&gt;8.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;58 MB/s&lt;/td&gt;
      &lt;td&gt;301 MB/s&lt;/td&gt;
      &lt;td&gt;2487371&lt;/td&gt;
      &lt;td&gt;7.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;48 MB/s&lt;/td&gt;
      &lt;td&gt;331 MB/s&lt;/td&gt;
      &lt;td&gt;2398761&lt;/td&gt;
      &lt;td&gt;7.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;6.52 MB/s&lt;/td&gt;
      &lt;td&gt;362 MB/s&lt;/td&gt;
      &lt;td&gt;1978318&lt;/td&gt;
      &lt;td&gt;5.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;511 MB/s&lt;/td&gt;
      &lt;td&gt;796 MB/s&lt;/td&gt;
      &lt;td&gt;10423020&lt;/td&gt;
      &lt;td&gt;31.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;524 MB/s&lt;/td&gt;
      &lt;td&gt;935 MB/s&lt;/td&gt;
      &lt;td&gt;9698071&lt;/td&gt;
      &lt;td&gt;28.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;547 MB/s&lt;/td&gt;
      &lt;td&gt;976 MB/s&lt;/td&gt;
      &lt;td&gt;8630804&lt;/td&gt;
      &lt;td&gt;25.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;593 MB/s&lt;/td&gt;
      &lt;td&gt;905 MB/s&lt;/td&gt;
      &lt;td&gt;8412942&lt;/td&gt;
      &lt;td&gt;25.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;190 MB/s&lt;/td&gt;
      &lt;td&gt;1081 MB/s&lt;/td&gt;
      &lt;td&gt;6556582&lt;/td&gt;
      &lt;td&gt;19.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;497 MB/s&lt;/td&gt;
      &lt;td&gt;5503 MB/s&lt;/td&gt;
      &lt;td&gt;5711408&lt;/td&gt;
      &lt;td&gt;17.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;509 MB/s&lt;/td&gt;
      &lt;td&gt;5254 MB/s&lt;/td&gt;
      &lt;td&gt;5796797&lt;/td&gt;
      &lt;td&gt;17.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;1.85 MB/s&lt;/td&gt;
      &lt;td&gt;7195 MB/s&lt;/td&gt;
      &lt;td&gt;3703275&lt;/td&gt;
      &lt;td&gt;11.04&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;847 MB/s&lt;/td&gt;
      &lt;td&gt;1343 MB/s&lt;/td&gt;
      &lt;td&gt;6160636&lt;/td&gt;
      &lt;td&gt;18.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;466 MB/s&lt;/td&gt;
      &lt;td&gt;1468 MB/s&lt;/td&gt;
      &lt;td&gt;4867322&lt;/td&gt;
      &lt;td&gt;14.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;96 MB/s&lt;/td&gt;
      &lt;td&gt;1945 MB/s&lt;/td&gt;
      &lt;td&gt;4482913&lt;/td&gt;
      &lt;td&gt;13.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;288 MB/s&lt;/td&gt;
      &lt;td&gt;902 MB/s&lt;/td&gt;
      &lt;td&gt;5050596&lt;/td&gt;
      &lt;td&gt;15.05&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;168 MB/s&lt;/td&gt;
      &lt;td&gt;1006 MB/s&lt;/td&gt;
      &lt;td&gt;4192253&lt;/td&gt;
      &lt;td&gt;12.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;113 MB/s&lt;/td&gt;
      &lt;td&gt;1017 MB/s&lt;/td&gt;
      &lt;td&gt;3910381&lt;/td&gt;
      &lt;td&gt;11.65&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;89 MB/s&lt;/td&gt;
      &lt;td&gt;1013 MB/s&lt;/td&gt;
      &lt;td&gt;3767494&lt;/td&gt;
      &lt;td&gt;11.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;249 MB/s&lt;/td&gt;
      &lt;td&gt;2719 MB/s&lt;/td&gt;
      &lt;td&gt;8224487&lt;/td&gt;
      &lt;td&gt;24.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;169 MB/s&lt;/td&gt;
      &lt;td&gt;3380 MB/s&lt;/td&gt;
      &lt;td&gt;6569703&lt;/td&gt;
      &lt;td&gt;19.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;65 MB/s&lt;/td&gt;
      &lt;td&gt;3505 MB/s&lt;/td&gt;
      &lt;td&gt;6280019&lt;/td&gt;
      &lt;td&gt;18.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;183 MB/s&lt;/td&gt;
      &lt;td&gt;674 MB/s&lt;/td&gt;
      &lt;td&gt;4624597&lt;/td&gt;
      &lt;td&gt;13.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;70 MB/s&lt;/td&gt;
      &lt;td&gt;809 MB/s&lt;/td&gt;
      &lt;td&gt;3200188&lt;/td&gt;
      &lt;td&gt;9.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;840 MB/s&lt;/td&gt;
      &lt;td&gt;2988001&lt;/td&gt;
      &lt;td&gt;8.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;732 MB/s&lt;/td&gt;
      &lt;td&gt;1047 MB/s&lt;/td&gt;
      &lt;td&gt;2876326&lt;/td&gt;
      &lt;td&gt;8.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;688 MB/s&lt;/td&gt;
      &lt;td&gt;1018 MB/s&lt;/td&gt;
      &lt;td&gt;2937436&lt;/td&gt;
      &lt;td&gt;8.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;278 MB/s&lt;/td&gt;
      &lt;td&gt;1015 MB/s&lt;/td&gt;
      &lt;td&gt;2810373&lt;/td&gt;
      &lt;td&gt;8.38&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;110 MB/s&lt;/td&gt;
      &lt;td&gt;1317 MB/s&lt;/td&gt;
      &lt;td&gt;2360355&lt;/td&gt;
      &lt;td&gt;7.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;46 MB/s&lt;/td&gt;
      &lt;td&gt;1459 MB/s&lt;/td&gt;
      &lt;td&gt;2197208&lt;/td&gt;
      &lt;td&gt;6.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;7.67 MB/s&lt;/td&gt;
      &lt;td&gt;1561 MB/s&lt;/td&gt;
      &lt;td&gt;1938899&lt;/td&gt;
      &lt;td&gt;5.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;3.85 MB/s&lt;/td&gt;
      &lt;td&gt;1418 MB/s&lt;/td&gt;
      &lt;td&gt;1802903&lt;/td&gt;
      &lt;td&gt;5.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;885 MB/s&lt;/td&gt;
      &lt;td&gt;1892 MB/s&lt;/td&gt;
      &lt;td&gt;5350052&lt;/td&gt;
      &lt;td&gt;15.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;778 MB/s&lt;/td&gt;
      &lt;td&gt;2114 MB/s&lt;/td&gt;
      &lt;td&gt;6316882&lt;/td&gt;
      &lt;td&gt;18.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;45 MB/s&lt;/td&gt;
      &lt;td&gt;904 MB/s&lt;/td&gt;
      &lt;td&gt;4046914&lt;/td&gt;
      &lt;td&gt;12.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Ooffice is a dll from open office. Again with this kind of binary LZSSE does not do as well, although LZSSE8 does a lot better here. Performance is much closer to LZ4.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;17628 MB/s&lt;/td&gt;
      &lt;td&gt;17832 MB/s&lt;/td&gt;
      &lt;td&gt;6152192&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1358 MB/s&lt;/td&gt;
      &lt;td&gt;17281 MB/s&lt;/td&gt;
      &lt;td&gt;6152192&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;699 MB/s&lt;/td&gt;
      &lt;td&gt;17330 MB/s&lt;/td&gt;
      &lt;td&gt;6152192&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;235 MB/s&lt;/td&gt;
      &lt;td&gt;5961 MB/s&lt;/td&gt;
      &lt;td&gt;5790799&lt;/td&gt;
      &lt;td&gt;94.13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;196 MB/s&lt;/td&gt;
      &lt;td&gt;722 MB/s&lt;/td&gt;
      &lt;td&gt;4297469&lt;/td&gt;
      &lt;td&gt;69.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;94 MB/s&lt;/td&gt;
      &lt;td&gt;172 MB/s&lt;/td&gt;
      &lt;td&gt;3543046&lt;/td&gt;
      &lt;td&gt;57.59&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;24 MB/s&lt;/td&gt;
      &lt;td&gt;190 MB/s&lt;/td&gt;
      &lt;td&gt;3188991&lt;/td&gt;
      &lt;td&gt;51.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;5.94 MB/s&lt;/td&gt;
      &lt;td&gt;195 MB/s&lt;/td&gt;
      &lt;td&gt;3077918&lt;/td&gt;
      &lt;td&gt;50.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;1.35 MB/s&lt;/td&gt;
      &lt;td&gt;202 MB/s&lt;/td&gt;
      &lt;td&gt;2958514&lt;/td&gt;
      &lt;td&gt;48.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;197 MB/s&lt;/td&gt;
      &lt;td&gt;538 MB/s&lt;/td&gt;
      &lt;td&gt;4301654&lt;/td&gt;
      &lt;td&gt;69.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;201 MB/s&lt;/td&gt;
      &lt;td&gt;515 MB/s&lt;/td&gt;
      &lt;td&gt;4259180&lt;/td&gt;
      &lt;td&gt;69.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;514 MB/s&lt;/td&gt;
      &lt;td&gt;2649 MB/s&lt;/td&gt;
      &lt;td&gt;4338918&lt;/td&gt;
      &lt;td&gt;70.53&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;746 MB/s&lt;/td&gt;
      &lt;td&gt;3142 MB/s&lt;/td&gt;
      &lt;td&gt;4733421&lt;/td&gt;
      &lt;td&gt;76.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1661 MB/s&lt;/td&gt;
      &lt;td&gt;6115 MB/s&lt;/td&gt;
      &lt;td&gt;5528929&lt;/td&gt;
      &lt;td&gt;89.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;94 MB/s&lt;/td&gt;
      &lt;td&gt;2439 MB/s&lt;/td&gt;
      &lt;td&gt;3823662&lt;/td&gt;
      &lt;td&gt;62.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;57 MB/s&lt;/td&gt;
      &lt;td&gt;2544 MB/s&lt;/td&gt;
      &lt;td&gt;3589528&lt;/td&gt;
      &lt;td&gt;58.35&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;38 MB/s&lt;/td&gt;
      &lt;td&gt;2562 MB/s&lt;/td&gt;
      &lt;td&gt;3544431&lt;/td&gt;
      &lt;td&gt;57.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;33 MB/s&lt;/td&gt;
      &lt;td&gt;2586 MB/s&lt;/td&gt;
      &lt;td&gt;3543539&lt;/td&gt;
      &lt;td&gt;57.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;28 MB/s&lt;/td&gt;
      &lt;td&gt;2581 MB/s&lt;/td&gt;
      &lt;td&gt;3543401&lt;/td&gt;
      &lt;td&gt;57.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;234 MB/s&lt;/td&gt;
      &lt;td&gt;565 MB/s&lt;/td&gt;
      &lt;td&gt;4297787&lt;/td&gt;
      &lt;td&gt;69.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;223 MB/s&lt;/td&gt;
      &lt;td&gt;554 MB/s&lt;/td&gt;
      &lt;td&gt;4213660&lt;/td&gt;
      &lt;td&gt;68.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;37 MB/s&lt;/td&gt;
      &lt;td&gt;486 MB/s&lt;/td&gt;
      &lt;td&gt;4139615&lt;/td&gt;
      &lt;td&gt;67.29&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;471 MB/s&lt;/td&gt;
      &lt;td&gt;3931101&lt;/td&gt;
      &lt;td&gt;63.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;458 MB/s&lt;/td&gt;
      &lt;td&gt;3812065&lt;/td&gt;
      &lt;td&gt;61.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;8.66 MB/s&lt;/td&gt;
      &lt;td&gt;444 MB/s&lt;/td&gt;
      &lt;td&gt;3674340&lt;/td&gt;
      &lt;td&gt;59.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;7.42 MB/s&lt;/td&gt;
      &lt;td&gt;132 MB/s&lt;/td&gt;
      &lt;td&gt;2822729&lt;/td&gt;
      &lt;td&gt;45.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.85 MB/s&lt;/td&gt;
      &lt;td&gt;162 MB/s&lt;/td&gt;
      &lt;td&gt;2578108&lt;/td&gt;
      &lt;td&gt;41.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;264 MB/s&lt;/td&gt;
      &lt;td&gt;472 MB/s&lt;/td&gt;
      &lt;td&gt;4600800&lt;/td&gt;
      &lt;td&gt;74.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;46 MB/s&lt;/td&gt;
      &lt;td&gt;2841578&lt;/td&gt;
      &lt;td&gt;46.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;51 MB/s&lt;/td&gt;
      &lt;td&gt;2703265&lt;/td&gt;
      &lt;td&gt;43.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;8.58 MB/s&lt;/td&gt;
      &lt;td&gt;54 MB/s&lt;/td&gt;
      &lt;td&gt;2637526&lt;/td&gt;
      &lt;td&gt;42.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;3.23 MB/s&lt;/td&gt;
      &lt;td&gt;57 MB/s&lt;/td&gt;
      &lt;td&gt;2428736&lt;/td&gt;
      &lt;td&gt;39.48&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;200 MB/s&lt;/td&gt;
      &lt;td&gt;472 MB/s&lt;/td&gt;
      &lt;td&gt;4269971&lt;/td&gt;
      &lt;td&gt;69.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;180 MB/s&lt;/td&gt;
      &lt;td&gt;552 MB/s&lt;/td&gt;
      &lt;td&gt;4256502&lt;/td&gt;
      &lt;td&gt;69.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;257 MB/s&lt;/td&gt;
      &lt;td&gt;521 MB/s&lt;/td&gt;
      &lt;td&gt;4138957&lt;/td&gt;
      &lt;td&gt;67.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;251 MB/s&lt;/td&gt;
      &lt;td&gt;421 MB/s&lt;/td&gt;
      &lt;td&gt;4036479&lt;/td&gt;
      &lt;td&gt;65.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;121 MB/s&lt;/td&gt;
      &lt;td&gt;411 MB/s&lt;/td&gt;
      &lt;td&gt;3847820&lt;/td&gt;
      &lt;td&gt;62.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;164 MB/s&lt;/td&gt;
      &lt;td&gt;2433 MB/s&lt;/td&gt;
      &lt;td&gt;3972687&lt;/td&gt;
      &lt;td&gt;64.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;162 MB/s&lt;/td&gt;
      &lt;td&gt;2710 MB/s&lt;/td&gt;
      &lt;td&gt;3922013&lt;/td&gt;
      &lt;td&gt;63.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;0.03 MB/s&lt;/td&gt;
      &lt;td&gt;2478 MB/s&lt;/td&gt;
      &lt;td&gt;3492808&lt;/td&gt;
      &lt;td&gt;56.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;339 MB/s&lt;/td&gt;
      &lt;td&gt;433 MB/s&lt;/td&gt;
      &lt;td&gt;4013859&lt;/td&gt;
      &lt;td&gt;65.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;167 MB/s&lt;/td&gt;
      &lt;td&gt;381 MB/s&lt;/td&gt;
      &lt;td&gt;3722542&lt;/td&gt;
      &lt;td&gt;60.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;45 MB/s&lt;/td&gt;
      &lt;td&gt;579 MB/s&lt;/td&gt;
      &lt;td&gt;3548660&lt;/td&gt;
      &lt;td&gt;57.68&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;48 MB/s&lt;/td&gt;
      &lt;td&gt;435 MB/s&lt;/td&gt;
      &lt;td&gt;4125570&lt;/td&gt;
      &lt;td&gt;67.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;33 MB/s&lt;/td&gt;
      &lt;td&gt;388 MB/s&lt;/td&gt;
      &lt;td&gt;3996893&lt;/td&gt;
      &lt;td&gt;64.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;24 MB/s&lt;/td&gt;
      &lt;td&gt;377 MB/s&lt;/td&gt;
      &lt;td&gt;3953444&lt;/td&gt;
      &lt;td&gt;64.26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;373 MB/s&lt;/td&gt;
      &lt;td&gt;3929331&lt;/td&gt;
      &lt;td&gt;63.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;109 MB/s&lt;/td&gt;
      &lt;td&gt;2458 MB/s&lt;/td&gt;
      &lt;td&gt;4175016&lt;/td&gt;
      &lt;td&gt;67.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;93 MB/s&lt;/td&gt;
      &lt;td&gt;2602 MB/s&lt;/td&gt;
      &lt;td&gt;4105418&lt;/td&gt;
      &lt;td&gt;66.73&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;85 MB/s&lt;/td&gt;
      &lt;td&gt;2611 MB/s&lt;/td&gt;
      &lt;td&gt;4090885&lt;/td&gt;
      &lt;td&gt;66.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;48 MB/s&lt;/td&gt;
      &lt;td&gt;224 MB/s&lt;/td&gt;
      &lt;td&gt;3290532&lt;/td&gt;
      &lt;td&gt;53.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;18 MB/s&lt;/td&gt;
      &lt;td&gt;244 MB/s&lt;/td&gt;
      &lt;td&gt;3097294&lt;/td&gt;
      &lt;td&gt;50.34&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;242 MB/s&lt;/td&gt;
      &lt;td&gt;3092926&lt;/td&gt;
      &lt;td&gt;50.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;268 MB/s&lt;/td&gt;
      &lt;td&gt;535 MB/s&lt;/td&gt;
      &lt;td&gt;3585831&lt;/td&gt;
      &lt;td&gt;58.29&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;202 MB/s&lt;/td&gt;
      &lt;td&gt;442 MB/s&lt;/td&gt;
      &lt;td&gt;3329621&lt;/td&gt;
      &lt;td&gt;54.12&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;73 MB/s&lt;/td&gt;
      &lt;td&gt;361 MB/s&lt;/td&gt;
      &lt;td&gt;3049253&lt;/td&gt;
      &lt;td&gt;49.56&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;365 MB/s&lt;/td&gt;
      &lt;td&gt;2891406&lt;/td&gt;
      &lt;td&gt;47.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;365 MB/s&lt;/td&gt;
      &lt;td&gt;2856608&lt;/td&gt;
      &lt;td&gt;46.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;8.28 MB/s&lt;/td&gt;
      &lt;td&gt;372 MB/s&lt;/td&gt;
      &lt;td&gt;2839843&lt;/td&gt;
      &lt;td&gt;46.16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;7.80 MB/s&lt;/td&gt;
      &lt;td&gt;368 MB/s&lt;/td&gt;
      &lt;td&gt;2838729&lt;/td&gt;
      &lt;td&gt;46.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;299 MB/s&lt;/td&gt;
      &lt;td&gt;902 MB/s&lt;/td&gt;
      &lt;td&gt;3868354&lt;/td&gt;
      &lt;td&gt;62.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;152 MB/s&lt;/td&gt;
      &lt;td&gt;1051 MB/s&lt;/td&gt;
      &lt;td&gt;4507764&lt;/td&gt;
      &lt;td&gt;73.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;32 MB/s&lt;/td&gt;
      &lt;td&gt;300 MB/s&lt;/td&gt;
      &lt;td&gt;3389975&lt;/td&gt;
      &lt;td&gt;55.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The next cab off the rank is osdb, which is a MySQL database. Here we do better than we did on the binaries, with LZSSE8 doing particularly well.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;13816 MB/s&lt;/td&gt;
      &lt;td&gt;13797 MB/s&lt;/td&gt;
      &lt;td&gt;10085684&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1653 MB/s&lt;/td&gt;
      &lt;td&gt;13740 MB/s&lt;/td&gt;
      &lt;td&gt;10085684&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;831 MB/s&lt;/td&gt;
      &lt;td&gt;13556 MB/s&lt;/td&gt;
      &lt;td&gt;10085684&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;267 MB/s&lt;/td&gt;
      &lt;td&gt;1273 MB/s&lt;/td&gt;
      &lt;td&gt;5736204&lt;/td&gt;
      &lt;td&gt;56.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;267 MB/s&lt;/td&gt;
      &lt;td&gt;1276 MB/s&lt;/td&gt;
      &lt;td&gt;5736204&lt;/td&gt;
      &lt;td&gt;56.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;131 MB/s&lt;/td&gt;
      &lt;td&gt;241 MB/s&lt;/td&gt;
      &lt;td&gt;4261872&lt;/td&gt;
      &lt;td&gt;42.26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;26 MB/s&lt;/td&gt;
      &lt;td&gt;302 MB/s&lt;/td&gt;
      &lt;td&gt;3944111&lt;/td&gt;
      &lt;td&gt;39.11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;4.72 MB/s&lt;/td&gt;
      &lt;td&gt;329 MB/s&lt;/td&gt;
      &lt;td&gt;3649422&lt;/td&gt;
      &lt;td&gt;36.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;1.25 MB/s&lt;/td&gt;
      &lt;td&gt;344 MB/s&lt;/td&gt;
      &lt;td&gt;3545628&lt;/td&gt;
      &lt;td&gt;35.16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;205 MB/s&lt;/td&gt;
      &lt;td&gt;812 MB/s&lt;/td&gt;
      &lt;td&gt;6716718&lt;/td&gt;
      &lt;td&gt;66.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;279 MB/s&lt;/td&gt;
      &lt;td&gt;775 MB/s&lt;/td&gt;
      &lt;td&gt;5391583&lt;/td&gt;
      &lt;td&gt;53.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;544 MB/s&lt;/td&gt;
      &lt;td&gt;2800 MB/s&lt;/td&gt;
      &lt;td&gt;5256666&lt;/td&gt;
      &lt;td&gt;52.12&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;685 MB/s&lt;/td&gt;
      &lt;td&gt;2796 MB/s&lt;/td&gt;
      &lt;td&gt;5864711&lt;/td&gt;
      &lt;td&gt;58.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1217 MB/s&lt;/td&gt;
      &lt;td&gt;4188 MB/s&lt;/td&gt;
      &lt;td&gt;8089261&lt;/td&gt;
      &lt;td&gt;80.21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;145 MB/s&lt;/td&gt;
      &lt;td&gt;3158 MB/s&lt;/td&gt;
      &lt;td&gt;4280365&lt;/td&gt;
      &lt;td&gt;42.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;80 MB/s&lt;/td&gt;
      &lt;td&gt;3150 MB/s&lt;/td&gt;
      &lt;td&gt;4017760&lt;/td&gt;
      &lt;td&gt;39.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;53 MB/s&lt;/td&gt;
      &lt;td&gt;3144 MB/s&lt;/td&gt;
      &lt;td&gt;3977505&lt;/td&gt;
      &lt;td&gt;39.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;53 MB/s&lt;/td&gt;
      &lt;td&gt;3145 MB/s&lt;/td&gt;
      &lt;td&gt;3977501&lt;/td&gt;
      &lt;td&gt;39.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;53 MB/s&lt;/td&gt;
      &lt;td&gt;3202 MB/s&lt;/td&gt;
      &lt;td&gt;3977501&lt;/td&gt;
      &lt;td&gt;39.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;256 MB/s&lt;/td&gt;
      &lt;td&gt;879 MB/s&lt;/td&gt;
      &lt;td&gt;6602260&lt;/td&gt;
      &lt;td&gt;65.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;282 MB/s&lt;/td&gt;
      &lt;td&gt;891 MB/s&lt;/td&gt;
      &lt;td&gt;6418449&lt;/td&gt;
      &lt;td&gt;63.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;44 MB/s&lt;/td&gt;
      &lt;td&gt;725 MB/s&lt;/td&gt;
      &lt;td&gt;8130169&lt;/td&gt;
      &lt;td&gt;80.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;37 MB/s&lt;/td&gt;
      &lt;td&gt;730 MB/s&lt;/td&gt;
      &lt;td&gt;5330956&lt;/td&gt;
      &lt;td&gt;52.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;869 MB/s&lt;/td&gt;
      &lt;td&gt;4413239&lt;/td&gt;
      &lt;td&gt;43.76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;891 MB/s&lt;/td&gt;
      &lt;td&gt;4206158&lt;/td&gt;
      &lt;td&gt;41.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;9.17 MB/s&lt;/td&gt;
      &lt;td&gt;231 MB/s&lt;/td&gt;
      &lt;td&gt;3530290&lt;/td&gt;
      &lt;td&gt;35.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.57 MB/s&lt;/td&gt;
      &lt;td&gt;283 MB/s&lt;/td&gt;
      &lt;td&gt;3152108&lt;/td&gt;
      &lt;td&gt;31.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;307 MB/s&lt;/td&gt;
      &lt;td&gt;620 MB/s&lt;/td&gt;
      &lt;td&gt;9545173&lt;/td&gt;
      &lt;td&gt;94.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;57 MB/s&lt;/td&gt;
      &lt;td&gt;3988823&lt;/td&gt;
      &lt;td&gt;39.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;73 MB/s&lt;/td&gt;
      &lt;td&gt;3307207&lt;/td&gt;
      &lt;td&gt;32.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;74 MB/s&lt;/td&gt;
      &lt;td&gt;3370412&lt;/td&gt;
      &lt;td&gt;33.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;2.98 MB/s&lt;/td&gt;
      &lt;td&gt;83 MB/s&lt;/td&gt;
      &lt;td&gt;2870328&lt;/td&gt;
      &lt;td&gt;28.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;182 MB/s&lt;/td&gt;
      &lt;td&gt;560 MB/s&lt;/td&gt;
      &lt;td&gt;8129348&lt;/td&gt;
      &lt;td&gt;80.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;151 MB/s&lt;/td&gt;
      &lt;td&gt;700 MB/s&lt;/td&gt;
      &lt;td&gt;8070717&lt;/td&gt;
      &lt;td&gt;80.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;306 MB/s&lt;/td&gt;
      &lt;td&gt;652 MB/s&lt;/td&gt;
      &lt;td&gt;7300607&lt;/td&gt;
      &lt;td&gt;72.39&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;325 MB/s&lt;/td&gt;
      &lt;td&gt;507 MB/s&lt;/td&gt;
      &lt;td&gt;5704498&lt;/td&gt;
      &lt;td&gt;56.56&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;151 MB/s&lt;/td&gt;
      &lt;td&gt;552 MB/s&lt;/td&gt;
      &lt;td&gt;5333359&lt;/td&gt;
      &lt;td&gt;52.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;260 MB/s&lt;/td&gt;
      &lt;td&gt;4066 MB/s&lt;/td&gt;
      &lt;td&gt;4262592&lt;/td&gt;
      &lt;td&gt;42.26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;261 MB/s&lt;/td&gt;
      &lt;td&gt;4512 MB/s&lt;/td&gt;
      &lt;td&gt;4175474&lt;/td&gt;
      &lt;td&gt;41.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;2.89 MB/s&lt;/td&gt;
      &lt;td&gt;3538 MB/s&lt;/td&gt;
      &lt;td&gt;3957567&lt;/td&gt;
      &lt;td&gt;39.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;435 MB/s&lt;/td&gt;
      &lt;td&gt;541 MB/s&lt;/td&gt;
      &lt;td&gt;5496443&lt;/td&gt;
      &lt;td&gt;54.50&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;225 MB/s&lt;/td&gt;
      &lt;td&gt;530 MB/s&lt;/td&gt;
      &lt;td&gt;4532176&lt;/td&gt;
      &lt;td&gt;44.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;53 MB/s&lt;/td&gt;
      &lt;td&gt;1168 MB/s&lt;/td&gt;
      &lt;td&gt;4259234&lt;/td&gt;
      &lt;td&gt;42.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;77 MB/s&lt;/td&gt;
      &lt;td&gt;676 MB/s&lt;/td&gt;
      &lt;td&gt;4570193&lt;/td&gt;
      &lt;td&gt;45.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;49 MB/s&lt;/td&gt;
      &lt;td&gt;690 MB/s&lt;/td&gt;
      &lt;td&gt;4465943&lt;/td&gt;
      &lt;td&gt;44.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;31 MB/s&lt;/td&gt;
      &lt;td&gt;718 MB/s&lt;/td&gt;
      &lt;td&gt;4384305&lt;/td&gt;
      &lt;td&gt;43.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;728 MB/s&lt;/td&gt;
      &lt;td&gt;4336873&lt;/td&gt;
      &lt;td&gt;43.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;98 MB/s&lt;/td&gt;
      &lt;td&gt;2640 MB/s&lt;/td&gt;
      &lt;td&gt;7445962&lt;/td&gt;
      &lt;td&gt;73.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;93 MB/s&lt;/td&gt;
      &lt;td&gt;2685 MB/s&lt;/td&gt;
      &lt;td&gt;7372889&lt;/td&gt;
      &lt;td&gt;73.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;93 MB/s&lt;/td&gt;
      &lt;td&gt;2688 MB/s&lt;/td&gt;
      &lt;td&gt;7370336&lt;/td&gt;
      &lt;td&gt;73.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;69 MB/s&lt;/td&gt;
      &lt;td&gt;344 MB/s&lt;/td&gt;
      &lt;td&gt;4076391&lt;/td&gt;
      &lt;td&gt;40.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;31 MB/s&lt;/td&gt;
      &lt;td&gt;368 MB/s&lt;/td&gt;
      &lt;td&gt;3695170&lt;/td&gt;
      &lt;td&gt;36.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;23 MB/s&lt;/td&gt;
      &lt;td&gt;376 MB/s&lt;/td&gt;
      &lt;td&gt;3673177&lt;/td&gt;
      &lt;td&gt;36.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;333 MB/s&lt;/td&gt;
      &lt;td&gt;622 MB/s&lt;/td&gt;
      &lt;td&gt;3790691&lt;/td&gt;
      &lt;td&gt;37.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;271 MB/s&lt;/td&gt;
      &lt;td&gt;574 MB/s&lt;/td&gt;
      &lt;td&gt;3517954&lt;/td&gt;
      &lt;td&gt;34.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;91 MB/s&lt;/td&gt;
      &lt;td&gt;529 MB/s&lt;/td&gt;
      &lt;td&gt;3503732&lt;/td&gt;
      &lt;td&gt;34.74&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;33 MB/s&lt;/td&gt;
      &lt;td&gt;544 MB/s&lt;/td&gt;
      &lt;td&gt;3380393&lt;/td&gt;
      &lt;td&gt;33.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;550 MB/s&lt;/td&gt;
      &lt;td&gt;3286962&lt;/td&gt;
      &lt;td&gt;32.59&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;5.74 MB/s&lt;/td&gt;
      &lt;td&gt;604 MB/s&lt;/td&gt;
      &lt;td&gt;3133720&lt;/td&gt;
      &lt;td&gt;31.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;5.30 MB/s&lt;/td&gt;
      &lt;td&gt;595 MB/s&lt;/td&gt;
      &lt;td&gt;3128197&lt;/td&gt;
      &lt;td&gt;31.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;545 MB/s&lt;/td&gt;
      &lt;td&gt;1721 MB/s&lt;/td&gt;
      &lt;td&gt;4641152&lt;/td&gt;
      &lt;td&gt;46.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;321 MB/s&lt;/td&gt;
      &lt;td&gt;1569 MB/s&lt;/td&gt;
      &lt;td&gt;4768614&lt;/td&gt;
      &lt;td&gt;47.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;64 MB/s&lt;/td&gt;
      &lt;td&gt;522 MB/s&lt;/td&gt;
      &lt;td&gt;4238262&lt;/td&gt;
      &lt;td&gt;42.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Reymont is a Polish literature work in pdf, this time LZSSE2 does well again.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;16651 MB/s&lt;/td&gt;
      &lt;td&gt;17036 MB/s&lt;/td&gt;
      &lt;td&gt;6627202&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1112 MB/s&lt;/td&gt;
      &lt;td&gt;16609 MB/s&lt;/td&gt;
      &lt;td&gt;6627202&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;575 MB/s&lt;/td&gt;
      &lt;td&gt;16820 MB/s&lt;/td&gt;
      &lt;td&gt;6627202&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;240 MB/s&lt;/td&gt;
      &lt;td&gt;793 MB/s&lt;/td&gt;
      &lt;td&gt;3259380&lt;/td&gt;
      &lt;td&gt;49.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;240 MB/s&lt;/td&gt;
      &lt;td&gt;786 MB/s&lt;/td&gt;
      &lt;td&gt;3243988&lt;/td&gt;
      &lt;td&gt;48.95&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;119 MB/s&lt;/td&gt;
      &lt;td&gt;168 MB/s&lt;/td&gt;
      &lt;td&gt;2493374&lt;/td&gt;
      &lt;td&gt;37.62&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;63 MB/s&lt;/td&gt;
      &lt;td&gt;248 MB/s&lt;/td&gt;
      &lt;td&gt;2190579&lt;/td&gt;
      &lt;td&gt;33.05&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;4.12 MB/s&lt;/td&gt;
      &lt;td&gt;321 MB/s&lt;/td&gt;
      &lt;td&gt;1758150&lt;/td&gt;
      &lt;td&gt;26.53&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;0.25 MB/s&lt;/td&gt;
      &lt;td&gt;355 MB/s&lt;/td&gt;
      &lt;td&gt;1644697&lt;/td&gt;
      &lt;td&gt;24.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;276 MB/s&lt;/td&gt;
      &lt;td&gt;556 MB/s&lt;/td&gt;
      &lt;td&gt;3335571&lt;/td&gt;
      &lt;td&gt;50.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;271 MB/s&lt;/td&gt;
      &lt;td&gt;546 MB/s&lt;/td&gt;
      &lt;td&gt;3186529&lt;/td&gt;
      &lt;td&gt;48.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;397 MB/s&lt;/td&gt;
      &lt;td&gt;2531 MB/s&lt;/td&gt;
      &lt;td&gt;3181387&lt;/td&gt;
      &lt;td&gt;48.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;417 MB/s&lt;/td&gt;
      &lt;td&gt;2514 MB/s&lt;/td&gt;
      &lt;td&gt;3322020&lt;/td&gt;
      &lt;td&gt;50.13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;568 MB/s&lt;/td&gt;
      &lt;td&gt;2509 MB/s&lt;/td&gt;
      &lt;td&gt;4403444&lt;/td&gt;
      &lt;td&gt;66.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;131 MB/s&lt;/td&gt;
      &lt;td&gt;2422 MB/s&lt;/td&gt;
      &lt;td&gt;2944201&lt;/td&gt;
      &lt;td&gt;44.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;62 MB/s&lt;/td&gt;
      &lt;td&gt;2738 MB/s&lt;/td&gt;
      &lt;td&gt;2361684&lt;/td&gt;
      &lt;td&gt;35.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;2826 MB/s&lt;/td&gt;
      &lt;td&gt;2114022&lt;/td&gt;
      &lt;td&gt;31.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;2835 MB/s&lt;/td&gt;
      &lt;td&gt;2106571&lt;/td&gt;
      &lt;td&gt;31.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;2836 MB/s&lt;/td&gt;
      &lt;td&gt;2106571&lt;/td&gt;
      &lt;td&gt;31.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;277 MB/s&lt;/td&gt;
      &lt;td&gt;579 MB/s&lt;/td&gt;
      &lt;td&gt;3365987&lt;/td&gt;
      &lt;td&gt;50.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;273 MB/s&lt;/td&gt;
      &lt;td&gt;595 MB/s&lt;/td&gt;
      &lt;td&gt;3253836&lt;/td&gt;
      &lt;td&gt;49.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;55 MB/s&lt;/td&gt;
      &lt;td&gt;416 MB/s&lt;/td&gt;
      &lt;td&gt;3326973&lt;/td&gt;
      &lt;td&gt;50.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;33 MB/s&lt;/td&gt;
      &lt;td&gt;486 MB/s&lt;/td&gt;
      &lt;td&gt;2948111&lt;/td&gt;
      &lt;td&gt;44.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;556 MB/s&lt;/td&gt;
      &lt;td&gt;2715211&lt;/td&gt;
      &lt;td&gt;40.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;6.11 MB/s&lt;/td&gt;
      &lt;td&gt;679 MB/s&lt;/td&gt;
      &lt;td&gt;2427424&lt;/td&gt;
      &lt;td&gt;36.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;9.12 MB/s&lt;/td&gt;
      &lt;td&gt;203 MB/s&lt;/td&gt;
      &lt;td&gt;2111331&lt;/td&gt;
      &lt;td&gt;31.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.80 MB/s&lt;/td&gt;
      &lt;td&gt;335 MB/s&lt;/td&gt;
      &lt;td&gt;1544771&lt;/td&gt;
      &lt;td&gt;23.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;219 MB/s&lt;/td&gt;
      &lt;td&gt;368 MB/s&lt;/td&gt;
      &lt;td&gt;3889268&lt;/td&gt;
      &lt;td&gt;58.69&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;78 MB/s&lt;/td&gt;
      &lt;td&gt;1921954&lt;/td&gt;
      &lt;td&gt;29.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;90 MB/s&lt;/td&gt;
      &lt;td&gt;1807903&lt;/td&gt;
      &lt;td&gt;27.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;94 MB/s&lt;/td&gt;
      &lt;td&gt;1777103&lt;/td&gt;
      &lt;td&gt;26.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;2.14 MB/s&lt;/td&gt;
      &lt;td&gt;136 MB/s&lt;/td&gt;
      &lt;td&gt;1340625&lt;/td&gt;
      &lt;td&gt;20.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;268 MB/s&lt;/td&gt;
      &lt;td&gt;464 MB/s&lt;/td&gt;
      &lt;td&gt;3524660&lt;/td&gt;
      &lt;td&gt;53.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;269 MB/s&lt;/td&gt;
      &lt;td&gt;522 MB/s&lt;/td&gt;
      &lt;td&gt;3512256&lt;/td&gt;
      &lt;td&gt;53.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;274 MB/s&lt;/td&gt;
      &lt;td&gt;562 MB/s&lt;/td&gt;
      &lt;td&gt;3224618&lt;/td&gt;
      &lt;td&gt;48.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;310 MB/s&lt;/td&gt;
      &lt;td&gt;561 MB/s&lt;/td&gt;
      &lt;td&gt;3043004&lt;/td&gt;
      &lt;td&gt;45.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;136 MB/s&lt;/td&gt;
      &lt;td&gt;629 MB/s&lt;/td&gt;
      &lt;td&gt;2502161&lt;/td&gt;
      &lt;td&gt;37.76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;251 MB/s&lt;/td&gt;
      &lt;td&gt;3020 MB/s&lt;/td&gt;
      &lt;td&gt;2925190&lt;/td&gt;
      &lt;td&gt;44.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;251 MB/s&lt;/td&gt;
      &lt;td&gt;2946 MB/s&lt;/td&gt;
      &lt;td&gt;2952727&lt;/td&gt;
      &lt;td&gt;44.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;2.59 MB/s&lt;/td&gt;
      &lt;td&gt;4960 MB/s&lt;/td&gt;
      &lt;td&gt;1852623&lt;/td&gt;
      &lt;td&gt;27.95&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;408 MB/s&lt;/td&gt;
      &lt;td&gt;613 MB/s&lt;/td&gt;
      &lt;td&gt;3003825&lt;/td&gt;
      &lt;td&gt;45.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;200 MB/s&lt;/td&gt;
      &lt;td&gt;573 MB/s&lt;/td&gt;
      &lt;td&gt;2560936&lt;/td&gt;
      &lt;td&gt;38.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;46 MB/s&lt;/td&gt;
      &lt;td&gt;774 MB/s&lt;/td&gt;
      &lt;td&gt;2448354&lt;/td&gt;
      &lt;td&gt;36.94&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;101 MB/s&lt;/td&gt;
      &lt;td&gt;372 MB/s&lt;/td&gt;
      &lt;td&gt;3017083&lt;/td&gt;
      &lt;td&gt;45.53&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;63 MB/s&lt;/td&gt;
      &lt;td&gt;405 MB/s&lt;/td&gt;
      &lt;td&gt;2679592&lt;/td&gt;
      &lt;td&gt;40.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;43 MB/s&lt;/td&gt;
      &lt;td&gt;420 MB/s&lt;/td&gt;
      &lt;td&gt;2569444&lt;/td&gt;
      &lt;td&gt;38.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;35 MB/s&lt;/td&gt;
      &lt;td&gt;428 MB/s&lt;/td&gt;
      &lt;td&gt;2520600&lt;/td&gt;
      &lt;td&gt;38.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;146 MB/s&lt;/td&gt;
      &lt;td&gt;1780 MB/s&lt;/td&gt;
      &lt;td&gt;3011002&lt;/td&gt;
      &lt;td&gt;45.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;89 MB/s&lt;/td&gt;
      &lt;td&gt;1896 MB/s&lt;/td&gt;
      &lt;td&gt;2781083&lt;/td&gt;
      &lt;td&gt;41.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;72 MB/s&lt;/td&gt;
      &lt;td&gt;1924 MB/s&lt;/td&gt;
      &lt;td&gt;2738695&lt;/td&gt;
      &lt;td&gt;41.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;76 MB/s&lt;/td&gt;
      &lt;td&gt;348 MB/s&lt;/td&gt;
      &lt;td&gt;2376430&lt;/td&gt;
      &lt;td&gt;35.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;381 MB/s&lt;/td&gt;
      &lt;td&gt;1860871&lt;/td&gt;
      &lt;td&gt;28.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;5.81 MB/s&lt;/td&gt;
      &lt;td&gt;380 MB/s&lt;/td&gt;
      &lt;td&gt;1823196&lt;/td&gt;
      &lt;td&gt;27.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;260 MB/s&lt;/td&gt;
      &lt;td&gt;454 MB/s&lt;/td&gt;
      &lt;td&gt;2169769&lt;/td&gt;
      &lt;td&gt;32.74&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;221 MB/s&lt;/td&gt;
      &lt;td&gt;387 MB/s&lt;/td&gt;
      &lt;td&gt;2100979&lt;/td&gt;
      &lt;td&gt;31.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;107 MB/s&lt;/td&gt;
      &lt;td&gt;388 MB/s&lt;/td&gt;
      &lt;td&gt;1974996&lt;/td&gt;
      &lt;td&gt;29.80&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;33 MB/s&lt;/td&gt;
      &lt;td&gt;477 MB/s&lt;/td&gt;
      &lt;td&gt;1724763&lt;/td&gt;
      &lt;td&gt;26.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;509 MB/s&lt;/td&gt;
      &lt;td&gt;1620588&lt;/td&gt;
      &lt;td&gt;24.45&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;4.55 MB/s&lt;/td&gt;
      &lt;td&gt;540 MB/s&lt;/td&gt;
      &lt;td&gt;1480040&lt;/td&gt;
      &lt;td&gt;22.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;3.43 MB/s&lt;/td&gt;
      &lt;td&gt;549 MB/s&lt;/td&gt;
      &lt;td&gt;1451022&lt;/td&gt;
      &lt;td&gt;21.89&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;347 MB/s&lt;/td&gt;
      &lt;td&gt;742 MB/s&lt;/td&gt;
      &lt;td&gt;3157154&lt;/td&gt;
      &lt;td&gt;47.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;252 MB/s&lt;/td&gt;
      &lt;td&gt;682 MB/s&lt;/td&gt;
      &lt;td&gt;4035470&lt;/td&gt;
      &lt;td&gt;60.89&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;469 MB/s&lt;/td&gt;
      &lt;td&gt;2124786&lt;/td&gt;
      &lt;td&gt;32.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The samba source code, similar performance characteristics to other text:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11729 MB/s&lt;/td&gt;
      &lt;td&gt;11492 MB/s&lt;/td&gt;
      &lt;td&gt;21606400&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1144 MB/s&lt;/td&gt;
      &lt;td&gt;11359 MB/s&lt;/td&gt;
      &lt;td&gt;21503746&lt;/td&gt;
      &lt;td&gt;99.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;603 MB/s&lt;/td&gt;
      &lt;td&gt;9883 MB/s&lt;/td&gt;
      &lt;td&gt;21074313&lt;/td&gt;
      &lt;td&gt;97.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;363 MB/s&lt;/td&gt;
      &lt;td&gt;1321 MB/s&lt;/td&gt;
      &lt;td&gt;8066597&lt;/td&gt;
      &lt;td&gt;37.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;353 MB/s&lt;/td&gt;
      &lt;td&gt;1315 MB/s&lt;/td&gt;
      &lt;td&gt;7953097&lt;/td&gt;
      &lt;td&gt;36.81&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;161 MB/s&lt;/td&gt;
      &lt;td&gt;272 MB/s&lt;/td&gt;
      &lt;td&gt;6175378&lt;/td&gt;
      &lt;td&gt;28.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;64 MB/s&lt;/td&gt;
      &lt;td&gt;366 MB/s&lt;/td&gt;
      &lt;td&gt;5531441&lt;/td&gt;
      &lt;td&gt;25.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;9.78 MB/s&lt;/td&gt;
      &lt;td&gt;411 MB/s&lt;/td&gt;
      &lt;td&gt;5046297&lt;/td&gt;
      &lt;td&gt;23.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;1.44 MB/s&lt;/td&gt;
      &lt;td&gt;429 MB/s&lt;/td&gt;
      &lt;td&gt;4912137&lt;/td&gt;
      &lt;td&gt;22.73&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;369 MB/s&lt;/td&gt;
      &lt;td&gt;803 MB/s&lt;/td&gt;
      &lt;td&gt;8327938&lt;/td&gt;
      &lt;td&gt;38.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;390 MB/s&lt;/td&gt;
      &lt;td&gt;828 MB/s&lt;/td&gt;
      &lt;td&gt;7651048&lt;/td&gt;
      &lt;td&gt;35.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;679 MB/s&lt;/td&gt;
      &lt;td&gt;3275 MB/s&lt;/td&gt;
      &lt;td&gt;7716839&lt;/td&gt;
      &lt;td&gt;35.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;724 MB/s&lt;/td&gt;
      &lt;td&gt;3200 MB/s&lt;/td&gt;
      &lt;td&gt;8250343&lt;/td&gt;
      &lt;td&gt;38.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1036 MB/s&lt;/td&gt;
      &lt;td&gt;3584 MB/s&lt;/td&gt;
      &lt;td&gt;11109978&lt;/td&gt;
      &lt;td&gt;51.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;177 MB/s&lt;/td&gt;
      &lt;td&gt;3213 MB/s&lt;/td&gt;
      &lt;td&gt;6858151&lt;/td&gt;
      &lt;td&gt;31.74&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;102 MB/s&lt;/td&gt;
      &lt;td&gt;3390 MB/s&lt;/td&gt;
      &lt;td&gt;6286421&lt;/td&gt;
      &lt;td&gt;29.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;46 MB/s&lt;/td&gt;
      &lt;td&gt;3448 MB/s&lt;/td&gt;
      &lt;td&gt;6142054&lt;/td&gt;
      &lt;td&gt;28.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;36 MB/s&lt;/td&gt;
      &lt;td&gt;3451 MB/s&lt;/td&gt;
      &lt;td&gt;6139201&lt;/td&gt;
      &lt;td&gt;28.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;30 MB/s&lt;/td&gt;
      &lt;td&gt;3486 MB/s&lt;/td&gt;
      &lt;td&gt;6138755&lt;/td&gt;
      &lt;td&gt;28.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;375 MB/s&lt;/td&gt;
      &lt;td&gt;872 MB/s&lt;/td&gt;
      &lt;td&gt;8616496&lt;/td&gt;
      &lt;td&gt;39.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;390 MB/s&lt;/td&gt;
      &lt;td&gt;914 MB/s&lt;/td&gt;
      &lt;td&gt;8208471&lt;/td&gt;
      &lt;td&gt;37.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;69 MB/s&lt;/td&gt;
      &lt;td&gt;664 MB/s&lt;/td&gt;
      &lt;td&gt;9073050&lt;/td&gt;
      &lt;td&gt;41.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;49 MB/s&lt;/td&gt;
      &lt;td&gt;711 MB/s&lt;/td&gt;
      &lt;td&gt;7759679&lt;/td&gt;
      &lt;td&gt;35.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;32 MB/s&lt;/td&gt;
      &lt;td&gt;776 MB/s&lt;/td&gt;
      &lt;td&gt;6981326&lt;/td&gt;
      &lt;td&gt;32.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;846 MB/s&lt;/td&gt;
      &lt;td&gt;6485251&lt;/td&gt;
      &lt;td&gt;30.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;332 MB/s&lt;/td&gt;
      &lt;td&gt;5194325&lt;/td&gt;
      &lt;td&gt;24.04&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;4.03 MB/s&lt;/td&gt;
      &lt;td&gt;446 MB/s&lt;/td&gt;
      &lt;td&gt;4282964&lt;/td&gt;
      &lt;td&gt;19.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;350 MB/s&lt;/td&gt;
      &lt;td&gt;591 MB/s&lt;/td&gt;
      &lt;td&gt;10566148&lt;/td&gt;
      &lt;td&gt;48.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;28 MB/s&lt;/td&gt;
      &lt;td&gt;89 MB/s&lt;/td&gt;
      &lt;td&gt;5338935&lt;/td&gt;
      &lt;td&gt;24.71&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;26 MB/s&lt;/td&gt;
      &lt;td&gt;108 MB/s&lt;/td&gt;
      &lt;td&gt;4635279&lt;/td&gt;
      &lt;td&gt;21.45&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;117 MB/s&lt;/td&gt;
      &lt;td&gt;4361856&lt;/td&gt;
      &lt;td&gt;20.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;4.31 MB/s&lt;/td&gt;
      &lt;td&gt;129 MB/s&lt;/td&gt;
      &lt;td&gt;3859221&lt;/td&gt;
      &lt;td&gt;17.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;337 MB/s&lt;/td&gt;
      &lt;td&gt;645 MB/s&lt;/td&gt;
      &lt;td&gt;9682113&lt;/td&gt;
      &lt;td&gt;44.81&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;304 MB/s&lt;/td&gt;
      &lt;td&gt;747 MB/s&lt;/td&gt;
      &lt;td&gt;9550240&lt;/td&gt;
      &lt;td&gt;44.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;374 MB/s&lt;/td&gt;
      &lt;td&gt;743 MB/s&lt;/td&gt;
      &lt;td&gt;8708966&lt;/td&gt;
      &lt;td&gt;40.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;403 MB/s&lt;/td&gt;
      &lt;td&gt;658 MB/s&lt;/td&gt;
      &lt;td&gt;8241669&lt;/td&gt;
      &lt;td&gt;38.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;168 MB/s&lt;/td&gt;
      &lt;td&gt;710 MB/s&lt;/td&gt;
      &lt;td&gt;7486315&lt;/td&gt;
      &lt;td&gt;34.65&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;297 MB/s&lt;/td&gt;
      &lt;td&gt;4045 MB/s&lt;/td&gt;
      &lt;td&gt;7601765&lt;/td&gt;
      &lt;td&gt;35.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;297 MB/s&lt;/td&gt;
      &lt;td&gt;4185 MB/s&lt;/td&gt;
      &lt;td&gt;7582300&lt;/td&gt;
      &lt;td&gt;35.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;0.21 MB/s&lt;/td&gt;
      &lt;td&gt;4400 MB/s&lt;/td&gt;
      &lt;td&gt;6088709&lt;/td&gt;
      &lt;td&gt;28.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;555 MB/s&lt;/td&gt;
      &lt;td&gt;792 MB/s&lt;/td&gt;
      &lt;td&gt;7309452&lt;/td&gt;
      &lt;td&gt;33.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;270 MB/s&lt;/td&gt;
      &lt;td&gt;735 MB/s&lt;/td&gt;
      &lt;td&gt;6548190&lt;/td&gt;
      &lt;td&gt;30.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;64 MB/s&lt;/td&gt;
      &lt;td&gt;1176 MB/s&lt;/td&gt;
      &lt;td&gt;6369074&lt;/td&gt;
      &lt;td&gt;29.48&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;116 MB/s&lt;/td&gt;
      &lt;td&gt;560 MB/s&lt;/td&gt;
      &lt;td&gt;7098899&lt;/td&gt;
      &lt;td&gt;32.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;71 MB/s&lt;/td&gt;
      &lt;td&gt;598 MB/s&lt;/td&gt;
      &lt;td&gt;6590006&lt;/td&gt;
      &lt;td&gt;30.50&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;48 MB/s&lt;/td&gt;
      &lt;td&gt;610 MB/s&lt;/td&gt;
      &lt;td&gt;6446898&lt;/td&gt;
      &lt;td&gt;29.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;37 MB/s&lt;/td&gt;
      &lt;td&gt;618 MB/s&lt;/td&gt;
      &lt;td&gt;6361237&lt;/td&gt;
      &lt;td&gt;29.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;162 MB/s&lt;/td&gt;
      &lt;td&gt;2318 MB/s&lt;/td&gt;
      &lt;td&gt;8788099&lt;/td&gt;
      &lt;td&gt;40.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;120 MB/s&lt;/td&gt;
      &lt;td&gt;2635 MB/s&lt;/td&gt;
      &lt;td&gt;8169046&lt;/td&gt;
      &lt;td&gt;37.81&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;90 MB/s&lt;/td&gt;
      &lt;td&gt;2682 MB/s&lt;/td&gt;
      &lt;td&gt;8021698&lt;/td&gt;
      &lt;td&gt;37.13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;96 MB/s&lt;/td&gt;
      &lt;td&gt;438 MB/s&lt;/td&gt;
      &lt;td&gt;6329455&lt;/td&gt;
      &lt;td&gt;29.29&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;37 MB/s&lt;/td&gt;
      &lt;td&gt;472 MB/s&lt;/td&gt;
      &lt;td&gt;5451405&lt;/td&gt;
      &lt;td&gt;25.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;475 MB/s&lt;/td&gt;
      &lt;td&gt;5402710&lt;/td&gt;
      &lt;td&gt;25.01&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;422 MB/s&lt;/td&gt;
      &lt;td&gt;720 MB/s&lt;/td&gt;
      &lt;td&gt;5573442&lt;/td&gt;
      &lt;td&gt;25.80&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;337 MB/s&lt;/td&gt;
      &lt;td&gt;656 MB/s&lt;/td&gt;
      &lt;td&gt;5418700&lt;/td&gt;
      &lt;td&gt;25.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;149 MB/s&lt;/td&gt;
      &lt;td&gt;652 MB/s&lt;/td&gt;
      &lt;td&gt;4953932&lt;/td&gt;
      &lt;td&gt;22.93&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;56 MB/s&lt;/td&gt;
      &lt;td&gt;755 MB/s&lt;/td&gt;
      &lt;td&gt;4503155&lt;/td&gt;
      &lt;td&gt;20.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;24 MB/s&lt;/td&gt;
      &lt;td&gt;778 MB/s&lt;/td&gt;
      &lt;td&gt;4360991&lt;/td&gt;
      &lt;td&gt;20.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;8.40 MB/s&lt;/td&gt;
      &lt;td&gt;809 MB/s&lt;/td&gt;
      &lt;td&gt;4204351&lt;/td&gt;
      &lt;td&gt;19.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;4.21 MB/s&lt;/td&gt;
      &lt;td&gt;794 MB/s&lt;/td&gt;
      &lt;td&gt;4171774&lt;/td&gt;
      &lt;td&gt;19.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;490 MB/s&lt;/td&gt;
      &lt;td&gt;1294 MB/s&lt;/td&gt;
      &lt;td&gt;7317434&lt;/td&gt;
      &lt;td&gt;33.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;344 MB/s&lt;/td&gt;
      &lt;td&gt;1167 MB/s&lt;/td&gt;
      &lt;td&gt;8856272&lt;/td&gt;
      &lt;td&gt;40.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;47 MB/s&lt;/td&gt;
      &lt;td&gt;646 MB/s&lt;/td&gt;
      &lt;td&gt;5783582&lt;/td&gt;
      &lt;td&gt;26.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The SAO star catalogue is less compressible and suits LZSSE8 very well, but LZSSE2 fairs quite poorly, even with the optimal parse advantage.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;16079 MB/s&lt;/td&gt;
      &lt;td&gt;16115 MB/s&lt;/td&gt;
      &lt;td&gt;7251944&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1660 MB/s&lt;/td&gt;
      &lt;td&gt;16044 MB/s&lt;/td&gt;
      &lt;td&gt;7251944&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;861 MB/s&lt;/td&gt;
      &lt;td&gt;15629 MB/s&lt;/td&gt;
      &lt;td&gt;7251944&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;289 MB/s&lt;/td&gt;
      &lt;td&gt;15629 MB/s&lt;/td&gt;
      &lt;td&gt;7251944&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;192 MB/s&lt;/td&gt;
      &lt;td&gt;935 MB/s&lt;/td&gt;
      &lt;td&gt;6541044&lt;/td&gt;
      &lt;td&gt;90.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;92 MB/s&lt;/td&gt;
      &lt;td&gt;194 MB/s&lt;/td&gt;
      &lt;td&gt;6139160&lt;/td&gt;
      &lt;td&gt;84.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;183 MB/s&lt;/td&gt;
      &lt;td&gt;5758539&lt;/td&gt;
      &lt;td&gt;79.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;3.86 MB/s&lt;/td&gt;
      &lt;td&gt;192 MB/s&lt;/td&gt;
      &lt;td&gt;5573768&lt;/td&gt;
      &lt;td&gt;76.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;0.68 MB/s&lt;/td&gt;
      &lt;td&gt;201 MB/s&lt;/td&gt;
      &lt;td&gt;5472031&lt;/td&gt;
      &lt;td&gt;75.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;159 MB/s&lt;/td&gt;
      &lt;td&gt;715 MB/s&lt;/td&gt;
      &lt;td&gt;6525733&lt;/td&gt;
      &lt;td&gt;89.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;220 MB/s&lt;/td&gt;
      &lt;td&gt;699 MB/s&lt;/td&gt;
      &lt;td&gt;6526165&lt;/td&gt;
      &lt;td&gt;89.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;504 MB/s&lt;/td&gt;
      &lt;td&gt;3393 MB/s&lt;/td&gt;
      &lt;td&gt;6790273&lt;/td&gt;
      &lt;td&gt;93.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;944 MB/s&lt;/td&gt;
      &lt;td&gt;4339 MB/s&lt;/td&gt;
      &lt;td&gt;6930690&lt;/td&gt;
      &lt;td&gt;95.57&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;2160 MB/s&lt;/td&gt;
      &lt;td&gt;8364 MB/s&lt;/td&gt;
      &lt;td&gt;7183536&lt;/td&gt;
      &lt;td&gt;99.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;81 MB/s&lt;/td&gt;
      &lt;td&gt;2131 MB/s&lt;/td&gt;
      &lt;td&gt;6240508&lt;/td&gt;
      &lt;td&gt;86.05&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;45 MB/s&lt;/td&gt;
      &lt;td&gt;2291 MB/s&lt;/td&gt;
      &lt;td&gt;5859003&lt;/td&gt;
      &lt;td&gt;80.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;29 MB/s&lt;/td&gt;
      &lt;td&gt;2404 MB/s&lt;/td&gt;
      &lt;td&gt;5735467&lt;/td&gt;
      &lt;td&gt;79.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;29 MB/s&lt;/td&gt;
      &lt;td&gt;2403 MB/s&lt;/td&gt;
      &lt;td&gt;5735136&lt;/td&gt;
      &lt;td&gt;79.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;29 MB/s&lt;/td&gt;
      &lt;td&gt;2402 MB/s&lt;/td&gt;
      &lt;td&gt;5735136&lt;/td&gt;
      &lt;td&gt;79.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;229 MB/s&lt;/td&gt;
      &lt;td&gt;708 MB/s&lt;/td&gt;
      &lt;td&gt;6325572&lt;/td&gt;
      &lt;td&gt;87.23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;219 MB/s&lt;/td&gt;
      &lt;td&gt;697 MB/s&lt;/td&gt;
      &lt;td&gt;6280222&lt;/td&gt;
      &lt;td&gt;86.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;26 MB/s&lt;/td&gt;
      &lt;td&gt;517 MB/s&lt;/td&gt;
      &lt;td&gt;6357698&lt;/td&gt;
      &lt;td&gt;87.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;493 MB/s&lt;/td&gt;
      &lt;td&gt;6217135&lt;/td&gt;
      &lt;td&gt;85.73&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;516 MB/s&lt;/td&gt;
      &lt;td&gt;6086665&lt;/td&gt;
      &lt;td&gt;83.93&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;6.36 MB/s&lt;/td&gt;
      &lt;td&gt;555 MB/s&lt;/td&gt;
      &lt;td&gt;5930187&lt;/td&gt;
      &lt;td&gt;81.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;6.91 MB/s&lt;/td&gt;
      &lt;td&gt;132 MB/s&lt;/td&gt;
      &lt;td&gt;4990889&lt;/td&gt;
      &lt;td&gt;68.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.16 MB/s&lt;/td&gt;
      &lt;td&gt;153 MB/s&lt;/td&gt;
      &lt;td&gt;4734194&lt;/td&gt;
      &lt;td&gt;65.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;282 MB/s&lt;/td&gt;
      &lt;td&gt;556 MB/s&lt;/td&gt;
      &lt;td&gt;7005137&lt;/td&gt;
      &lt;td&gt;96.60&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;32 MB/s&lt;/td&gt;
      &lt;td&gt;4923529&lt;/td&gt;
      &lt;td&gt;67.89&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;9.73 MB/s&lt;/td&gt;
      &lt;td&gt;33 MB/s&lt;/td&gt;
      &lt;td&gt;4892916&lt;/td&gt;
      &lt;td&gt;67.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;5.77 MB/s&lt;/td&gt;
      &lt;td&gt;33 MB/s&lt;/td&gt;
      &lt;td&gt;4894122&lt;/td&gt;
      &lt;td&gt;67.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;3.04 MB/s&lt;/td&gt;
      &lt;td&gt;36 MB/s&lt;/td&gt;
      &lt;td&gt;4418197&lt;/td&gt;
      &lt;td&gt;60.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;164 MB/s&lt;/td&gt;
      &lt;td&gt;507 MB/s&lt;/td&gt;
      &lt;td&gt;6582297&lt;/td&gt;
      &lt;td&gt;90.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;138 MB/s&lt;/td&gt;
      &lt;td&gt;622 MB/s&lt;/td&gt;
      &lt;td&gt;6582297&lt;/td&gt;
      &lt;td&gt;90.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;268 MB/s&lt;/td&gt;
      &lt;td&gt;582 MB/s&lt;/td&gt;
      &lt;td&gt;6540282&lt;/td&gt;
      &lt;td&gt;90.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;269 MB/s&lt;/td&gt;
      &lt;td&gt;403 MB/s&lt;/td&gt;
      &lt;td&gt;6477885&lt;/td&gt;
      &lt;td&gt;89.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;110 MB/s&lt;/td&gt;
      &lt;td&gt;426 MB/s&lt;/td&gt;
      &lt;td&gt;6178268&lt;/td&gt;
      &lt;td&gt;85.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;168 MB/s&lt;/td&gt;
      &lt;td&gt;2432 MB/s&lt;/td&gt;
      &lt;td&gt;6305407&lt;/td&gt;
      &lt;td&gt;86.95&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;166 MB/s&lt;/td&gt;
      &lt;td&gt;3274 MB/s&lt;/td&gt;
      &lt;td&gt;6045723&lt;/td&gt;
      &lt;td&gt;83.37&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;2.59 MB/s&lt;/td&gt;
      &lt;td&gt;1863 MB/s&lt;/td&gt;
      &lt;td&gt;6066923&lt;/td&gt;
      &lt;td&gt;83.66&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;359 MB/s&lt;/td&gt;
      &lt;td&gt;353 MB/s&lt;/td&gt;
      &lt;td&gt;6498301&lt;/td&gt;
      &lt;td&gt;89.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;142 MB/s&lt;/td&gt;
      &lt;td&gt;271 MB/s&lt;/td&gt;
      &lt;td&gt;6121309&lt;/td&gt;
      &lt;td&gt;84.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;37 MB/s&lt;/td&gt;
      &lt;td&gt;751 MB/s&lt;/td&gt;
      &lt;td&gt;6073127&lt;/td&gt;
      &lt;td&gt;83.74&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;38 MB/s&lt;/td&gt;
      &lt;td&gt;611 MB/s&lt;/td&gt;
      &lt;td&gt;6299030&lt;/td&gt;
      &lt;td&gt;86.86&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;24 MB/s&lt;/td&gt;
      &lt;td&gt;568 MB/s&lt;/td&gt;
      &lt;td&gt;6084431&lt;/td&gt;
      &lt;td&gt;83.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;548 MB/s&lt;/td&gt;
      &lt;td&gt;6042253&lt;/td&gt;
      &lt;td&gt;83.32&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;543 MB/s&lt;/td&gt;
      &lt;td&gt;6021554&lt;/td&gt;
      &lt;td&gt;83.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;94 MB/s&lt;/td&gt;
      &lt;td&gt;2367 MB/s&lt;/td&gt;
      &lt;td&gt;6153132&lt;/td&gt;
      &lt;td&gt;84.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;86 MB/s&lt;/td&gt;
      &lt;td&gt;2383 MB/s&lt;/td&gt;
      &lt;td&gt;6096705&lt;/td&gt;
      &lt;td&gt;84.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;85 MB/s&lt;/td&gt;
      &lt;td&gt;2389 MB/s&lt;/td&gt;
      &lt;td&gt;6091380&lt;/td&gt;
      &lt;td&gt;84.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;37 MB/s&lt;/td&gt;
      &lt;td&gt;246 MB/s&lt;/td&gt;
      &lt;td&gt;5567774&lt;/td&gt;
      &lt;td&gt;76.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;271 MB/s&lt;/td&gt;
      &lt;td&gt;5331799&lt;/td&gt;
      &lt;td&gt;73.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;274 MB/s&lt;/td&gt;
      &lt;td&gt;5325920&lt;/td&gt;
      &lt;td&gt;73.44&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;235 MB/s&lt;/td&gt;
      &lt;td&gt;482 MB/s&lt;/td&gt;
      &lt;td&gt;6255977&lt;/td&gt;
      &lt;td&gt;86.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;169 MB/s&lt;/td&gt;
      &lt;td&gt;418 MB/s&lt;/td&gt;
      &lt;td&gt;5818661&lt;/td&gt;
      &lt;td&gt;80.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;53 MB/s&lt;/td&gt;
      &lt;td&gt;355 MB/s&lt;/td&gt;
      &lt;td&gt;5403988&lt;/td&gt;
      &lt;td&gt;74.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;365 MB/s&lt;/td&gt;
      &lt;td&gt;5228930&lt;/td&gt;
      &lt;td&gt;72.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;7.85 MB/s&lt;/td&gt;
      &lt;td&gt;357 MB/s&lt;/td&gt;
      &lt;td&gt;5200485&lt;/td&gt;
      &lt;td&gt;71.71&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;6.44 MB/s&lt;/td&gt;
      &lt;td&gt;351 MB/s&lt;/td&gt;
      &lt;td&gt;5202330&lt;/td&gt;
      &lt;td&gt;71.74&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;6.40 MB/s&lt;/td&gt;
      &lt;td&gt;351 MB/s&lt;/td&gt;
      &lt;td&gt;5201103&lt;/td&gt;
      &lt;td&gt;71.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;333 MB/s&lt;/td&gt;
      &lt;td&gt;1409 MB/s&lt;/td&gt;
      &lt;td&gt;6394653&lt;/td&gt;
      &lt;td&gt;88.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;131 MB/s&lt;/td&gt;
      &lt;td&gt;1405 MB/s&lt;/td&gt;
      &lt;td&gt;6677960&lt;/td&gt;
      &lt;td&gt;92.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;32 MB/s&lt;/td&gt;
      &lt;td&gt;341 MB/s&lt;/td&gt;
      &lt;td&gt;5862040&lt;/td&gt;
      &lt;td&gt;80.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The 1913 Webster dictionary works well with LZSSE2. There is a definite trend towards LZSSE2 for the more compressible text.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;11704 MB/s&lt;/td&gt;
      &lt;td&gt;11681 MB/s&lt;/td&gt;
      &lt;td&gt;41458703&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1087 MB/s&lt;/td&gt;
      &lt;td&gt;11355 MB/s&lt;/td&gt;
      &lt;td&gt;41458703&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;567 MB/s&lt;/td&gt;
      &lt;td&gt;11358 MB/s&lt;/td&gt;
      &lt;td&gt;41458703&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;242 MB/s&lt;/td&gt;
      &lt;td&gt;854 MB/s&lt;/td&gt;
      &lt;td&gt;20100893&lt;/td&gt;
      &lt;td&gt;48.48&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;242 MB/s&lt;/td&gt;
      &lt;td&gt;855 MB/s&lt;/td&gt;
      &lt;td&gt;20100893&lt;/td&gt;
      &lt;td&gt;48.48&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;112 MB/s&lt;/td&gt;
      &lt;td&gt;166 MB/s&lt;/td&gt;
      &lt;td&gt;15088514&lt;/td&gt;
      &lt;td&gt;36.39&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;55 MB/s&lt;/td&gt;
      &lt;td&gt;270 MB/s&lt;/td&gt;
      &lt;td&gt;12752811&lt;/td&gt;
      &lt;td&gt;30.76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;4.04 MB/s&lt;/td&gt;
      &lt;td&gt;322 MB/s&lt;/td&gt;
      &lt;td&gt;10826131&lt;/td&gt;
      &lt;td&gt;26.11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;0.50 MB/s&lt;/td&gt;
      &lt;td&gt;335 MB/s&lt;/td&gt;
      &lt;td&gt;10430224&lt;/td&gt;
      &lt;td&gt;25.16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;287 MB/s&lt;/td&gt;
      &lt;td&gt;563 MB/s&lt;/td&gt;
      &lt;td&gt;20113352&lt;/td&gt;
      &lt;td&gt;48.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;267 MB/s&lt;/td&gt;
      &lt;td&gt;554 MB/s&lt;/td&gt;
      &lt;td&gt;19693994&lt;/td&gt;
      &lt;td&gt;47.50&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;454 MB/s&lt;/td&gt;
      &lt;td&gt;2566 MB/s&lt;/td&gt;
      &lt;td&gt;20139988&lt;/td&gt;
      &lt;td&gt;48.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;507 MB/s&lt;/td&gt;
      &lt;td&gt;2538 MB/s&lt;/td&gt;
      &lt;td&gt;21871634&lt;/td&gt;
      &lt;td&gt;52.76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;819 MB/s&lt;/td&gt;
      &lt;td&gt;2961 MB/s&lt;/td&gt;
      &lt;td&gt;28765737&lt;/td&gt;
      &lt;td&gt;69.38&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;136 MB/s&lt;/td&gt;
      &lt;td&gt;2370 MB/s&lt;/td&gt;
      &lt;td&gt;16861690&lt;/td&gt;
      &lt;td&gt;40.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;70 MB/s&lt;/td&gt;
      &lt;td&gt;2499 MB/s&lt;/td&gt;
      &lt;td&gt;14557596&lt;/td&gt;
      &lt;td&gt;35.11&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;30 MB/s&lt;/td&gt;
      &lt;td&gt;2536 MB/s&lt;/td&gt;
      &lt;td&gt;14006633&lt;/td&gt;
      &lt;td&gt;33.78&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;2536 MB/s&lt;/td&gt;
      &lt;td&gt;13995894&lt;/td&gt;
      &lt;td&gt;33.76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;2537 MB/s&lt;/td&gt;
      &lt;td&gt;13995894&lt;/td&gt;
      &lt;td&gt;33.76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;275 MB/s&lt;/td&gt;
      &lt;td&gt;602 MB/s&lt;/td&gt;
      &lt;td&gt;20788247&lt;/td&gt;
      &lt;td&gt;50.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;276 MB/s&lt;/td&gt;
      &lt;td&gt;635 MB/s&lt;/td&gt;
      &lt;td&gt;19701097&lt;/td&gt;
      &lt;td&gt;47.52&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;70 MB/s&lt;/td&gt;
      &lt;td&gt;500 MB/s&lt;/td&gt;
      &lt;td&gt;21258007&lt;/td&gt;
      &lt;td&gt;51.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;41 MB/s&lt;/td&gt;
      &lt;td&gt;503 MB/s&lt;/td&gt;
      &lt;td&gt;18766104&lt;/td&gt;
      &lt;td&gt;45.26&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;21 MB/s&lt;/td&gt;
      &lt;td&gt;548 MB/s&lt;/td&gt;
      &lt;td&gt;17083163&lt;/td&gt;
      &lt;td&gt;41.21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;7.18 MB/s&lt;/td&gt;
      &lt;td&gt;642 MB/s&lt;/td&gt;
      &lt;td&gt;15354723&lt;/td&gt;
      &lt;td&gt;37.04&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;9.65 MB/s&lt;/td&gt;
      &lt;td&gt;216 MB/s&lt;/td&gt;
      &lt;td&gt;13254015&lt;/td&gt;
      &lt;td&gt;31.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.79 MB/s&lt;/td&gt;
      &lt;td&gt;332 MB/s&lt;/td&gt;
      &lt;td&gt;9988909&lt;/td&gt;
      &lt;td&gt;24.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;257 MB/s&lt;/td&gt;
      &lt;td&gt;442 MB/s&lt;/td&gt;
      &lt;td&gt;25415740&lt;/td&gt;
      &lt;td&gt;61.30&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;22 MB/s&lt;/td&gt;
      &lt;td&gt;75 MB/s&lt;/td&gt;
      &lt;td&gt;12704878&lt;/td&gt;
      &lt;td&gt;30.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;19 MB/s&lt;/td&gt;
      &lt;td&gt;94 MB/s&lt;/td&gt;
      &lt;td&gt;11298267&lt;/td&gt;
      &lt;td&gt;27.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;12 MB/s&lt;/td&gt;
      &lt;td&gt;101 MB/s&lt;/td&gt;
      &lt;td&gt;10831475&lt;/td&gt;
      &lt;td&gt;26.13&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;2.13 MB/s&lt;/td&gt;
      &lt;td&gt;122 MB/s&lt;/td&gt;
      &lt;td&gt;8797488&lt;/td&gt;
      &lt;td&gt;21.22&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;253 MB/s&lt;/td&gt;
      &lt;td&gt;465 MB/s&lt;/td&gt;
      &lt;td&gt;22060671&lt;/td&gt;
      &lt;td&gt;53.21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;250 MB/s&lt;/td&gt;
      &lt;td&gt;524 MB/s&lt;/td&gt;
      &lt;td&gt;21825578&lt;/td&gt;
      &lt;td&gt;52.64&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;263 MB/s&lt;/td&gt;
      &lt;td&gt;546 MB/s&lt;/td&gt;
      &lt;td&gt;19983920&lt;/td&gt;
      &lt;td&gt;48.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;294 MB/s&lt;/td&gt;
      &lt;td&gt;537 MB/s&lt;/td&gt;
      &lt;td&gt;18773214&lt;/td&gt;
      &lt;td&gt;45.28&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;136 MB/s&lt;/td&gt;
      &lt;td&gt;565 MB/s&lt;/td&gt;
      &lt;td&gt;16407820&lt;/td&gt;
      &lt;td&gt;39.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;242 MB/s&lt;/td&gt;
      &lt;td&gt;3541 MB/s&lt;/td&gt;
      &lt;td&gt;16613479&lt;/td&gt;
      &lt;td&gt;40.07&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;241 MB/s&lt;/td&gt;
      &lt;td&gt;3378 MB/s&lt;/td&gt;
      &lt;td&gt;16775799&lt;/td&gt;
      &lt;td&gt;40.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;2.62 MB/s&lt;/td&gt;
      &lt;td&gt;4496 MB/s&lt;/td&gt;
      &lt;td&gt;12372209&lt;/td&gt;
      &lt;td&gt;29.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;390 MB/s&lt;/td&gt;
      &lt;td&gt;611 MB/s&lt;/td&gt;
      &lt;td&gt;18315816&lt;/td&gt;
      &lt;td&gt;44.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;195 MB/s&lt;/td&gt;
      &lt;td&gt;601 MB/s&lt;/td&gt;
      &lt;td&gt;15734418&lt;/td&gt;
      &lt;td&gt;37.95&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;48 MB/s&lt;/td&gt;
      &lt;td&gt;820 MB/s&lt;/td&gt;
      &lt;td&gt;15101357&lt;/td&gt;
      &lt;td&gt;36.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;93 MB/s&lt;/td&gt;
      &lt;td&gt;364 MB/s&lt;/td&gt;
      &lt;td&gt;18435248&lt;/td&gt;
      &lt;td&gt;44.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;58 MB/s&lt;/td&gt;
      &lt;td&gt;393 MB/s&lt;/td&gt;
      &lt;td&gt;16188981&lt;/td&gt;
      &lt;td&gt;39.05&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;36 MB/s&lt;/td&gt;
      &lt;td&gt;389 MB/s&lt;/td&gt;
      &lt;td&gt;15382920&lt;/td&gt;
      &lt;td&gt;37.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;370 MB/s&lt;/td&gt;
      &lt;td&gt;15006287&lt;/td&gt;
      &lt;td&gt;36.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;135 MB/s&lt;/td&gt;
      &lt;td&gt;1872 MB/s&lt;/td&gt;
      &lt;td&gt;19174395&lt;/td&gt;
      &lt;td&gt;46.25&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;101 MB/s&lt;/td&gt;
      &lt;td&gt;1935 MB/s&lt;/td&gt;
      &lt;td&gt;18513087&lt;/td&gt;
      &lt;td&gt;44.65&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;88 MB/s&lt;/td&gt;
      &lt;td&gt;1947 MB/s&lt;/td&gt;
      &lt;td&gt;18410318&lt;/td&gt;
      &lt;td&gt;44.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;78 MB/s&lt;/td&gt;
      &lt;td&gt;346 MB/s&lt;/td&gt;
      &lt;td&gt;14991242&lt;/td&gt;
      &lt;td&gt;36.16&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;26 MB/s&lt;/td&gt;
      &lt;td&gt;366 MB/s&lt;/td&gt;
      &lt;td&gt;12213947&lt;/td&gt;
      &lt;td&gt;29.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;16 MB/s&lt;/td&gt;
      &lt;td&gt;369 MB/s&lt;/td&gt;
      &lt;td&gt;12073475&lt;/td&gt;
      &lt;td&gt;29.12&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;284 MB/s&lt;/td&gt;
      &lt;td&gt;519 MB/s&lt;/td&gt;
      &lt;td&gt;13759779&lt;/td&gt;
      &lt;td&gt;33.19&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;211 MB/s&lt;/td&gt;
      &lt;td&gt;432 MB/s&lt;/td&gt;
      &lt;td&gt;12990370&lt;/td&gt;
      &lt;td&gt;31.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;111 MB/s&lt;/td&gt;
      &lt;td&gt;401 MB/s&lt;/td&gt;
      &lt;td&gt;11917853&lt;/td&gt;
      &lt;td&gt;28.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;31 MB/s&lt;/td&gt;
      &lt;td&gt;463 MB/s&lt;/td&gt;
      &lt;td&gt;10591896&lt;/td&gt;
      &lt;td&gt;25.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;10 MB/s&lt;/td&gt;
      &lt;td&gt;484 MB/s&lt;/td&gt;
      &lt;td&gt;10118655&lt;/td&gt;
      &lt;td&gt;24.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;4.25 MB/s&lt;/td&gt;
      &lt;td&gt;459 MB/s&lt;/td&gt;
      &lt;td&gt;9454323&lt;/td&gt;
      &lt;td&gt;22.80&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;2.70 MB/s&lt;/td&gt;
      &lt;td&gt;344 MB/s&lt;/td&gt;
      &lt;td&gt;9120434&lt;/td&gt;
      &lt;td&gt;22.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;333 MB/s&lt;/td&gt;
      &lt;td&gt;861 MB/s&lt;/td&gt;
      &lt;td&gt;18510142&lt;/td&gt;
      &lt;td&gt;44.65&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;228 MB/s&lt;/td&gt;
      &lt;td&gt;762 MB/s&lt;/td&gt;
      &lt;td&gt;22825692&lt;/td&gt;
      &lt;td&gt;55.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;32 MB/s&lt;/td&gt;
      &lt;td&gt;446 MB/s&lt;/td&gt;
      &lt;td&gt;14027055&lt;/td&gt;
      &lt;td&gt;33.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Collected xml files, the optimal parse and the focus on matches instead of literals means LZSSE2 again performs very well, copying a lot of bytes per step and the control word probabilities suiting it well:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;19297 MB/s&lt;/td&gt;
      &lt;td&gt;19297 MB/s&lt;/td&gt;
      &lt;td&gt;5345280&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1110 MB/s&lt;/td&gt;
      &lt;td&gt;18755 MB/s&lt;/td&gt;
      &lt;td&gt;5345280&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;671 MB/s&lt;/td&gt;
      &lt;td&gt;5292 MB/s&lt;/td&gt;
      &lt;td&gt;3573039&lt;/td&gt;
      &lt;td&gt;66.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;470 MB/s&lt;/td&gt;
      &lt;td&gt;1552 MB/s&lt;/td&gt;
      &lt;td&gt;1334659&lt;/td&gt;
      &lt;td&gt;24.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;472 MB/s&lt;/td&gt;
      &lt;td&gt;1559 MB/s&lt;/td&gt;
      &lt;td&gt;1334659&lt;/td&gt;
      &lt;td&gt;24.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;196 MB/s&lt;/td&gt;
      &lt;td&gt;303 MB/s&lt;/td&gt;
      &lt;td&gt;1087960&lt;/td&gt;
      &lt;td&gt;20.35&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;116 MB/s&lt;/td&gt;
      &lt;td&gt;518 MB/s&lt;/td&gt;
      &lt;td&gt;772420&lt;/td&gt;
      &lt;td&gt;14.45&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;24 MB/s&lt;/td&gt;
      &lt;td&gt;676 MB/s&lt;/td&gt;
      &lt;td&gt;597351&lt;/td&gt;
      &lt;td&gt;11.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;3.58 MB/s&lt;/td&gt;
      &lt;td&gt;715 MB/s&lt;/td&gt;
      &lt;td&gt;563740&lt;/td&gt;
      &lt;td&gt;10.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;536 MB/s&lt;/td&gt;
      &lt;td&gt;951 MB/s&lt;/td&gt;
      &lt;td&gt;1385060&lt;/td&gt;
      &lt;td&gt;25.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;525 MB/s&lt;/td&gt;
      &lt;td&gt;966 MB/s&lt;/td&gt;
      &lt;td&gt;1273649&lt;/td&gt;
      &lt;td&gt;23.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;867 MB/s&lt;/td&gt;
      &lt;td&gt;3287 MB/s&lt;/td&gt;
      &lt;td&gt;1227495&lt;/td&gt;
      &lt;td&gt;22.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;920 MB/s&lt;/td&gt;
      &lt;td&gt;3297 MB/s&lt;/td&gt;
      &lt;td&gt;1294713&lt;/td&gt;
      &lt;td&gt;24.22&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;1141 MB/s&lt;/td&gt;
      &lt;td&gt;3400 MB/s&lt;/td&gt;
      &lt;td&gt;1671390&lt;/td&gt;
      &lt;td&gt;31.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;233 MB/s&lt;/td&gt;
      &lt;td&gt;3351 MB/s&lt;/td&gt;
      &lt;td&gt;1098791&lt;/td&gt;
      &lt;td&gt;20.56&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;137 MB/s&lt;/td&gt;
      &lt;td&gt;4096 MB/s&lt;/td&gt;
      &lt;td&gt;829982&lt;/td&gt;
      &lt;td&gt;15.53&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;56 MB/s&lt;/td&gt;
      &lt;td&gt;4454 MB/s&lt;/td&gt;
      &lt;td&gt;770453&lt;/td&gt;
      &lt;td&gt;14.41&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;49 MB/s&lt;/td&gt;
      &lt;td&gt;4465 MB/s&lt;/td&gt;
      &lt;td&gt;769600&lt;/td&gt;
      &lt;td&gt;14.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;49 MB/s&lt;/td&gt;
      &lt;td&gt;4461 MB/s&lt;/td&gt;
      &lt;td&gt;769600&lt;/td&gt;
      &lt;td&gt;14.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;521 MB/s&lt;/td&gt;
      &lt;td&gt;1083 MB/s&lt;/td&gt;
      &lt;td&gt;1438227&lt;/td&gt;
      &lt;td&gt;26.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;526 MB/s&lt;/td&gt;
      &lt;td&gt;1137 MB/s&lt;/td&gt;
      &lt;td&gt;1379833&lt;/td&gt;
      &lt;td&gt;25.81&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;97 MB/s&lt;/td&gt;
      &lt;td&gt;813 MB/s&lt;/td&gt;
      &lt;td&gt;1490854&lt;/td&gt;
      &lt;td&gt;27.89&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;65 MB/s&lt;/td&gt;
      &lt;td&gt;919 MB/s&lt;/td&gt;
      &lt;td&gt;1132076&lt;/td&gt;
      &lt;td&gt;21.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;42 MB/s&lt;/td&gt;
      &lt;td&gt;1015 MB/s&lt;/td&gt;
      &lt;td&gt;1017213&lt;/td&gt;
      &lt;td&gt;19.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;1199 MB/s&lt;/td&gt;
      &lt;td&gt;849051&lt;/td&gt;
      &lt;td&gt;15.88&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;13 MB/s&lt;/td&gt;
      &lt;td&gt;503 MB/s&lt;/td&gt;
      &lt;td&gt;722379&lt;/td&gt;
      &lt;td&gt;13.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;3.93 MB/s&lt;/td&gt;
      &lt;td&gt;766 MB/s&lt;/td&gt;
      &lt;td&gt;533740&lt;/td&gt;
      &lt;td&gt;9.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;361 MB/s&lt;/td&gt;
      &lt;td&gt;582 MB/s&lt;/td&gt;
      &lt;td&gt;2130319&lt;/td&gt;
      &lt;td&gt;39.85&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;44 MB/s&lt;/td&gt;
      &lt;td&gt;170 MB/s&lt;/td&gt;
      &lt;td&gt;691236&lt;/td&gt;
      &lt;td&gt;12.93&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;44 MB/s&lt;/td&gt;
      &lt;td&gt;222 MB/s&lt;/td&gt;
      &lt;td&gt;570904&lt;/td&gt;
      &lt;td&gt;10.68&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;38 MB/s&lt;/td&gt;
      &lt;td&gt;230 MB/s&lt;/td&gt;
      &lt;td&gt;559244&lt;/td&gt;
      &lt;td&gt;10.46&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;6.88 MB/s&lt;/td&gt;
      &lt;td&gt;259 MB/s&lt;/td&gt;
      &lt;td&gt;484357&lt;/td&gt;
      &lt;td&gt;9.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;429 MB/s&lt;/td&gt;
      &lt;td&gt;711 MB/s&lt;/td&gt;
      &lt;td&gt;1844800&lt;/td&gt;
      &lt;td&gt;34.51&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;425 MB/s&lt;/td&gt;
      &lt;td&gt;803 MB/s&lt;/td&gt;
      &lt;td&gt;1794772&lt;/td&gt;
      &lt;td&gt;33.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;465 MB/s&lt;/td&gt;
      &lt;td&gt;862 MB/s&lt;/td&gt;
      &lt;td&gt;1574249&lt;/td&gt;
      &lt;td&gt;29.45&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;504 MB/s&lt;/td&gt;
      &lt;td&gt;822 MB/s&lt;/td&gt;
      &lt;td&gt;1501348&lt;/td&gt;
      &lt;td&gt;28.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;204 MB/s&lt;/td&gt;
      &lt;td&gt;934 MB/s&lt;/td&gt;
      &lt;td&gt;1232257&lt;/td&gt;
      &lt;td&gt;23.05&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;383 MB/s&lt;/td&gt;
      &lt;td&gt;4403 MB/s&lt;/td&gt;
      &lt;td&gt;1388503&lt;/td&gt;
      &lt;td&gt;25.98&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;381 MB/s&lt;/td&gt;
      &lt;td&gt;4179 MB/s&lt;/td&gt;
      &lt;td&gt;1406119&lt;/td&gt;
      &lt;td&gt;26.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;0.41 MB/s&lt;/td&gt;
      &lt;td&gt;6723 MB/s&lt;/td&gt;
      &lt;td&gt;767398&lt;/td&gt;
      &lt;td&gt;14.36&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;739 MB/s&lt;/td&gt;
      &lt;td&gt;1189 MB/s&lt;/td&gt;
      &lt;td&gt;1124708&lt;/td&gt;
      &lt;td&gt;21.04&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;422 MB/s&lt;/td&gt;
      &lt;td&gt;1332 MB/s&lt;/td&gt;
      &lt;td&gt;897312&lt;/td&gt;
      &lt;td&gt;16.79&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;89 MB/s&lt;/td&gt;
      &lt;td&gt;1575 MB/s&lt;/td&gt;
      &lt;td&gt;918580&lt;/td&gt;
      &lt;td&gt;17.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;213 MB/s&lt;/td&gt;
      &lt;td&gt;765 MB/s&lt;/td&gt;
      &lt;td&gt;1067378&lt;/td&gt;
      &lt;td&gt;19.97&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;149 MB/s&lt;/td&gt;
      &lt;td&gt;913 MB/s&lt;/td&gt;
      &lt;td&gt;892051&lt;/td&gt;
      &lt;td&gt;16.69&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;114 MB/s&lt;/td&gt;
      &lt;td&gt;949 MB/s&lt;/td&gt;
      &lt;td&gt;850394&lt;/td&gt;
      &lt;td&gt;15.91&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;96 MB/s&lt;/td&gt;
      &lt;td&gt;962 MB/s&lt;/td&gt;
      &lt;td&gt;834608&lt;/td&gt;
      &lt;td&gt;15.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;210 MB/s&lt;/td&gt;
      &lt;td&gt;2825 MB/s&lt;/td&gt;
      &lt;td&gt;1361662&lt;/td&gt;
      &lt;td&gt;25.47&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;135 MB/s&lt;/td&gt;
      &lt;td&gt;3059 MB/s&lt;/td&gt;
      &lt;td&gt;1234356&lt;/td&gt;
      &lt;td&gt;23.09&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;98 MB/s&lt;/td&gt;
      &lt;td&gt;3227 MB/s&lt;/td&gt;
      &lt;td&gt;1205281&lt;/td&gt;
      &lt;td&gt;22.55&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;147 MB/s&lt;/td&gt;
      &lt;td&gt;564 MB/s&lt;/td&gt;
      &lt;td&gt;965248&lt;/td&gt;
      &lt;td&gt;18.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;53 MB/s&lt;/td&gt;
      &lt;td&gt;683 MB/s&lt;/td&gt;
      &lt;td&gt;687997&lt;/td&gt;
      &lt;td&gt;12.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;28 MB/s&lt;/td&gt;
      &lt;td&gt;702 MB/s&lt;/td&gt;
      &lt;td&gt;658905&lt;/td&gt;
      &lt;td&gt;12.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;603 MB/s&lt;/td&gt;
      &lt;td&gt;955 MB/s&lt;/td&gt;
      &lt;td&gt;709132&lt;/td&gt;
      &lt;td&gt;13.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;523 MB/s&lt;/td&gt;
      &lt;td&gt;874 MB/s&lt;/td&gt;
      &lt;td&gt;695991&lt;/td&gt;
      &lt;td&gt;13.02&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;213 MB/s&lt;/td&gt;
      &lt;td&gt;905 MB/s&lt;/td&gt;
      &lt;td&gt;629082&lt;/td&gt;
      &lt;td&gt;11.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;90 MB/s&lt;/td&gt;
      &lt;td&gt;1122 MB/s&lt;/td&gt;
      &lt;td&gt;537682&lt;/td&gt;
      &lt;td&gt;10.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;46 MB/s&lt;/td&gt;
      &lt;td&gt;1209 MB/s&lt;/td&gt;
      &lt;td&gt;512754&lt;/td&gt;
      &lt;td&gt;9.59&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;8.47 MB/s&lt;/td&gt;
      &lt;td&gt;1288 MB/s&lt;/td&gt;
      &lt;td&gt;491938&lt;/td&gt;
      &lt;td&gt;9.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;7.37 MB/s&lt;/td&gt;
      &lt;td&gt;1298 MB/s&lt;/td&gt;
      &lt;td&gt;488349&lt;/td&gt;
      &lt;td&gt;9.14&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;644 MB/s&lt;/td&gt;
      &lt;td&gt;1448 MB/s&lt;/td&gt;
      &lt;td&gt;1242035&lt;/td&gt;
      &lt;td&gt;23.24&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;536 MB/s&lt;/td&gt;
      &lt;td&gt;1408 MB/s&lt;/td&gt;
      &lt;td&gt;1447468&lt;/td&gt;
      &lt;td&gt;27.08&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;81 MB/s&lt;/td&gt;
      &lt;td&gt;835 MB/s&lt;/td&gt;
      &lt;td&gt;769801&lt;/td&gt;
      &lt;td&gt;14.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The last file of Silesia, an x-ray medical image, is less compressible and suits LZSSE8.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;15105 MB/s&lt;/td&gt;
      &lt;td&gt;15186 MB/s&lt;/td&gt;
      &lt;td&gt;8474240&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 1&lt;/td&gt;
      &lt;td&gt;1864 MB/s&lt;/td&gt;
      &lt;td&gt;15078 MB/s&lt;/td&gt;
      &lt;td&gt;8474240&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 3&lt;/td&gt;
      &lt;td&gt;980 MB/s&lt;/td&gt;
      &lt;td&gt;14815 MB/s&lt;/td&gt;
      &lt;td&gt;8474240&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 6&lt;/td&gt;
      &lt;td&gt;333 MB/s&lt;/td&gt;
      &lt;td&gt;14815 MB/s&lt;/td&gt;
      &lt;td&gt;8474240&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;blosclz 2015-11-10 level 9&lt;/td&gt;
      &lt;td&gt;206 MB/s&lt;/td&gt;
      &lt;td&gt;672 MB/s&lt;/td&gt;
      &lt;td&gt;8216913&lt;/td&gt;
      &lt;td&gt;96.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;brieflz 1.1.0&lt;/td&gt;
      &lt;td&gt;76 MB/s&lt;/td&gt;
      &lt;td&gt;133 MB/s&lt;/td&gt;
      &lt;td&gt;7333725&lt;/td&gt;
      &lt;td&gt;86.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 0&lt;/td&gt;
      &lt;td&gt;17 MB/s&lt;/td&gt;
      &lt;td&gt;197 MB/s&lt;/td&gt;
      &lt;td&gt;6390926&lt;/td&gt;
      &lt;td&gt;75.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 1&lt;/td&gt;
      &lt;td&gt;8.38 MB/s&lt;/td&gt;
      &lt;td&gt;201 MB/s&lt;/td&gt;
      &lt;td&gt;6256115&lt;/td&gt;
      &lt;td&gt;73.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;crush 1.0 level 2&lt;/td&gt;
      &lt;td&gt;4.37 MB/s&lt;/td&gt;
      &lt;td&gt;188 MB/s&lt;/td&gt;
      &lt;td&gt;5958599&lt;/td&gt;
      &lt;td&gt;70.31&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 1&lt;/td&gt;
      &lt;td&gt;206 MB/s&lt;/td&gt;
      &lt;td&gt;698 MB/s&lt;/td&gt;
      &lt;td&gt;8202940&lt;/td&gt;
      &lt;td&gt;96.80&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;fastlz 0.1 level 2&lt;/td&gt;
      &lt;td&gt;228 MB/s&lt;/td&gt;
      &lt;td&gt;702 MB/s&lt;/td&gt;
      &lt;td&gt;8200360&lt;/td&gt;
      &lt;td&gt;96.77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;1321 MB/s&lt;/td&gt;
      &lt;td&gt;6763 MB/s&lt;/td&gt;
      &lt;td&gt;8390195&lt;/td&gt;
      &lt;td&gt;99.01&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 3&lt;/td&gt;
      &lt;td&gt;1912 MB/s&lt;/td&gt;
      &lt;td&gt;8093 MB/s&lt;/td&gt;
      &lt;td&gt;8460144&lt;/td&gt;
      &lt;td&gt;99.83&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4fast r131 level 17&lt;/td&gt;
      &lt;td&gt;3609 MB/s&lt;/td&gt;
      &lt;td&gt;8976 MB/s&lt;/td&gt;
      &lt;td&gt;8503227&lt;/td&gt;
      &lt;td&gt;100.34&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;82 MB/s&lt;/td&gt;
      &lt;td&gt;2488 MB/s&lt;/td&gt;
      &lt;td&gt;7569783&lt;/td&gt;
      &lt;td&gt;89.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;45 MB/s&lt;/td&gt;
      &lt;td&gt;2255 MB/s&lt;/td&gt;
      &lt;td&gt;7177516&lt;/td&gt;
      &lt;td&gt;84.70&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 9&lt;/td&gt;
      &lt;td&gt;44 MB/s&lt;/td&gt;
      &lt;td&gt;2255 MB/s&lt;/td&gt;
      &lt;td&gt;7175001&lt;/td&gt;
      &lt;td&gt;84.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;44 MB/s&lt;/td&gt;
      &lt;td&gt;2254 MB/s&lt;/td&gt;
      &lt;td&gt;7175001&lt;/td&gt;
      &lt;td&gt;84.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;44 MB/s&lt;/td&gt;
      &lt;td&gt;2256 MB/s&lt;/td&gt;
      &lt;td&gt;7175001&lt;/td&gt;
      &lt;td&gt;84.67&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 0&lt;/td&gt;
      &lt;td&gt;265 MB/s&lt;/td&gt;
      &lt;td&gt;845 MB/s&lt;/td&gt;
      &lt;td&gt;8283610&lt;/td&gt;
      &lt;td&gt;97.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzf 3.6 level 1&lt;/td&gt;
      &lt;td&gt;260 MB/s&lt;/td&gt;
      &lt;td&gt;743 MB/s&lt;/td&gt;
      &lt;td&gt;8111360&lt;/td&gt;
      &lt;td&gt;95.72&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 1&lt;/td&gt;
      &lt;td&gt;52 MB/s&lt;/td&gt;
      &lt;td&gt;564 MB/s&lt;/td&gt;
      &lt;td&gt;7811567&lt;/td&gt;
      &lt;td&gt;92.18&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 4&lt;/td&gt;
      &lt;td&gt;32 MB/s&lt;/td&gt;
      &lt;td&gt;527 MB/s&lt;/td&gt;
      &lt;td&gt;7710338&lt;/td&gt;
      &lt;td&gt;90.99&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 6&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;490 MB/s&lt;/td&gt;
      &lt;td&gt;7531355&lt;/td&gt;
      &lt;td&gt;88.87&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzg 1.0.8 level 8&lt;/td&gt;
      &lt;td&gt;5.44 MB/s&lt;/td&gt;
      &lt;td&gt;475 MB/s&lt;/td&gt;
      &lt;td&gt;7239622&lt;/td&gt;
      &lt;td&gt;85.43&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 0&lt;/td&gt;
      &lt;td&gt;7.46 MB/s&lt;/td&gt;
      &lt;td&gt;120 MB/s&lt;/td&gt;
      &lt;td&gt;4622273&lt;/td&gt;
      &lt;td&gt;54.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzham 1.0 -d26 level 1&lt;/td&gt;
      &lt;td&gt;2.54 MB/s&lt;/td&gt;
      &lt;td&gt;128 MB/s&lt;/td&gt;
      &lt;td&gt;4549082&lt;/td&gt;
      &lt;td&gt;53.68&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzjb 2010&lt;/td&gt;
      &lt;td&gt;280 MB/s&lt;/td&gt;
      &lt;td&gt;602 MB/s&lt;/td&gt;
      &lt;td&gt;8353724&lt;/td&gt;
      &lt;td&gt;98.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 0&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;36 MB/s&lt;/td&gt;
      &lt;td&gt;5198894&lt;/td&gt;
      &lt;td&gt;61.35&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 2&lt;/td&gt;
      &lt;td&gt;11 MB/s&lt;/td&gt;
      &lt;td&gt;41 MB/s&lt;/td&gt;
      &lt;td&gt;5069114&lt;/td&gt;
      &lt;td&gt;59.82&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 4&lt;/td&gt;
      &lt;td&gt;5.25 MB/s&lt;/td&gt;
      &lt;td&gt;47 MB/s&lt;/td&gt;
      &lt;td&gt;4923749&lt;/td&gt;
      &lt;td&gt;58.10&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzma 9.38 level 5&lt;/td&gt;
      &lt;td&gt;3.18 MB/s&lt;/td&gt;
      &lt;td&gt;40 MB/s&lt;/td&gt;
      &lt;td&gt;4487613&lt;/td&gt;
      &lt;td&gt;52.96&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 1&lt;/td&gt;
      &lt;td&gt;188 MB/s&lt;/td&gt;
      &lt;td&gt;559 MB/s&lt;/td&gt;
      &lt;td&gt;7821233&lt;/td&gt;
      &lt;td&gt;92.29&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 2&lt;/td&gt;
      &lt;td&gt;161 MB/s&lt;/td&gt;
      &lt;td&gt;708 MB/s&lt;/td&gt;
      &lt;td&gt;7821232&lt;/td&gt;
      &lt;td&gt;92.29&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 3&lt;/td&gt;
      &lt;td&gt;273 MB/s&lt;/td&gt;
      &lt;td&gt;706 MB/s&lt;/td&gt;
      &lt;td&gt;7763663&lt;/td&gt;
      &lt;td&gt;91.61&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 4&lt;/td&gt;
      &lt;td&gt;274 MB/s&lt;/td&gt;
      &lt;td&gt;468 MB/s&lt;/td&gt;
      &lt;td&gt;7533798&lt;/td&gt;
      &lt;td&gt;88.90&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzrw 15-Jul-1991 level 5&lt;/td&gt;
      &lt;td&gt;116 MB/s&lt;/td&gt;
      &lt;td&gt;476 MB/s&lt;/td&gt;
      &lt;td&gt;7375665&lt;/td&gt;
      &lt;td&gt;87.04&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;177 MB/s&lt;/td&gt;
      &lt;td&gt;2383 MB/s&lt;/td&gt;
      &lt;td&gt;7525821&lt;/td&gt;
      &lt;td&gt;88.81&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;174 MB/s&lt;/td&gt;
      &lt;td&gt;3074 MB/s&lt;/td&gt;
      &lt;td&gt;7248659&lt;/td&gt;
      &lt;td&gt;85.54&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;2.91 MB/s&lt;/td&gt;
      &lt;td&gt;1626 MB/s&lt;/td&gt;
      &lt;td&gt;7035769&lt;/td&gt;
      &lt;td&gt;83.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 1&lt;/td&gt;
      &lt;td&gt;386 MB/s&lt;/td&gt;
      &lt;td&gt;330 MB/s&lt;/td&gt;
      &lt;td&gt;7440632&lt;/td&gt;
      &lt;td&gt;87.80&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 2&lt;/td&gt;
      &lt;td&gt;152 MB/s&lt;/td&gt;
      &lt;td&gt;285 MB/s&lt;/td&gt;
      &lt;td&gt;6952012&lt;/td&gt;
      &lt;td&gt;82.04&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;quicklz 1.5.0 level 3&lt;/td&gt;
      &lt;td&gt;39 MB/s&lt;/td&gt;
      &lt;td&gt;590 MB/s&lt;/td&gt;
      &lt;td&gt;6713171&lt;/td&gt;
      &lt;td&gt;79.22&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 1&lt;/td&gt;
      &lt;td&gt;37 MB/s&lt;/td&gt;
      &lt;td&gt;592 MB/s&lt;/td&gt;
      &lt;td&gt;7933653&lt;/td&gt;
      &lt;td&gt;93.62&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 4&lt;/td&gt;
      &lt;td&gt;27 MB/s&lt;/td&gt;
      &lt;td&gt;394 MB/s&lt;/td&gt;
      &lt;td&gt;7893419&lt;/td&gt;
      &lt;td&gt;93.15&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 8&lt;/td&gt;
      &lt;td&gt;20 MB/s&lt;/td&gt;
      &lt;td&gt;353 MB/s&lt;/td&gt;
      &lt;td&gt;7914786&lt;/td&gt;
      &lt;td&gt;93.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yalz77 2015-09-19 level 12&lt;/td&gt;
      &lt;td&gt;15 MB/s&lt;/td&gt;
      &lt;td&gt;347 MB/s&lt;/td&gt;
      &lt;td&gt;7904338&lt;/td&gt;
      &lt;td&gt;93.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 1&lt;/td&gt;
      &lt;td&gt;89 MB/s&lt;/td&gt;
      &lt;td&gt;4859 MB/s&lt;/td&gt;
      &lt;td&gt;8328020&lt;/td&gt;
      &lt;td&gt;98.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 10&lt;/td&gt;
      &lt;td&gt;89 MB/s&lt;/td&gt;
      &lt;td&gt;4801 MB/s&lt;/td&gt;
      &lt;td&gt;8327929&lt;/td&gt;
      &lt;td&gt;98.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;yappy 2014-03-22 level 100&lt;/td&gt;
      &lt;td&gt;89 MB/s&lt;/td&gt;
      &lt;td&gt;4798 MB/s&lt;/td&gt;
      &lt;td&gt;8327919&lt;/td&gt;
      &lt;td&gt;98.27&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 1&lt;/td&gt;
      &lt;td&gt;44 MB/s&lt;/td&gt;
      &lt;td&gt;229 MB/s&lt;/td&gt;
      &lt;td&gt;6033932&lt;/td&gt;
      &lt;td&gt;71.20&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 6&lt;/td&gt;
      &lt;td&gt;23 MB/s&lt;/td&gt;
      &lt;td&gt;219 MB/s&lt;/td&gt;
      &lt;td&gt;6045117&lt;/td&gt;
      &lt;td&gt;71.34&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zlib 1.2.8 level 9&lt;/td&gt;
      &lt;td&gt;23 MB/s&lt;/td&gt;
      &lt;td&gt;219 MB/s&lt;/td&gt;
      &lt;td&gt;6045038&lt;/td&gt;
      &lt;td&gt;71.33&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 1&lt;/td&gt;
      &lt;td&gt;593 MB/s&lt;/td&gt;
      &lt;td&gt;680 MB/s&lt;/td&gt;
      &lt;td&gt;6772806&lt;/td&gt;
      &lt;td&gt;79.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 2&lt;/td&gt;
      &lt;td&gt;269 MB/s&lt;/td&gt;
      &lt;td&gt;596 MB/s&lt;/td&gt;
      &lt;td&gt;6688571&lt;/td&gt;
      &lt;td&gt;78.93&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 5&lt;/td&gt;
      &lt;td&gt;57 MB/s&lt;/td&gt;
      &lt;td&gt;275 MB/s&lt;/td&gt;
      &lt;td&gt;5748916&lt;/td&gt;
      &lt;td&gt;67.84&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 9&lt;/td&gt;
      &lt;td&gt;14 MB/s&lt;/td&gt;
      &lt;td&gt;229 MB/s&lt;/td&gt;
      &lt;td&gt;5368140&lt;/td&gt;
      &lt;td&gt;63.35&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 13&lt;/td&gt;
      &lt;td&gt;8.18 MB/s&lt;/td&gt;
      &lt;td&gt;223 MB/s&lt;/td&gt;
      &lt;td&gt;5317081&lt;/td&gt;
      &lt;td&gt;62.74&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 17&lt;/td&gt;
      &lt;td&gt;5.96 MB/s&lt;/td&gt;
      &lt;td&gt;215 MB/s&lt;/td&gt;
      &lt;td&gt;5306998&lt;/td&gt;
      &lt;td&gt;62.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;zstd v0.4.1 level 20&lt;/td&gt;
      &lt;td&gt;5.89 MB/s&lt;/td&gt;
      &lt;td&gt;217 MB/s&lt;/td&gt;
      &lt;td&gt;5306994&lt;/td&gt;
      &lt;td&gt;62.63&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;shrinker 0.1&lt;/td&gt;
      &lt;td&gt;310 MB/s&lt;/td&gt;
      &lt;td&gt;1332 MB/s&lt;/td&gt;
      &lt;td&gt;7709609&lt;/td&gt;
      &lt;td&gt;90.98&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;wflz 2015-09-16&lt;/td&gt;
      &lt;td&gt;126 MB/s&lt;/td&gt;
      &lt;td&gt;1531 MB/s&lt;/td&gt;
      &lt;td&gt;8007717&lt;/td&gt;
      &lt;td&gt;94.49&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzmat 1.01&lt;/td&gt;
      &lt;td&gt;45 MB/s&lt;/td&gt;
      &lt;td&gt;334 MB/s&lt;/td&gt;
      &lt;td&gt;6953823&lt;/td&gt;
      &lt;td&gt;82.06&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Here’s enwik9 from the Large Text Compression Benchmark, mainly for completeness, as there is a quite large number of published results for this benchmark elsewhere. Note, I used 128MiB blocksize for this test, instead of the default as used on the other tests. Curiously here, we actually beat memcpy, probably due to some OS related memory management shenanigans:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Compressor name&lt;/th&gt;
      &lt;th&gt;  Compression  &lt;/th&gt;
      &lt;th&gt;  Decompress.  &lt;/th&gt;
      &lt;th&gt;  Compr. size  &lt;/th&gt;
      &lt;th&gt;  Ratio  &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;memcpy&lt;/td&gt;
      &lt;td&gt;3606 MB/s&lt;/td&gt;
      &lt;td&gt;3627 MB/s&lt;/td&gt;
      &lt;td&gt;1000000000&lt;/td&gt;
      &lt;td&gt;100.00&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4 r131&lt;/td&gt;
      &lt;td&gt;478 MB/s&lt;/td&gt;
      &lt;td&gt;2648 MB/s&lt;/td&gt;
      &lt;td&gt;509203962&lt;/td&gt;
      &lt;td&gt;50.92&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 1&lt;/td&gt;
      &lt;td&gt;130 MB/s&lt;/td&gt;
      &lt;td&gt;2508 MB/s&lt;/td&gt;
      &lt;td&gt;433450594&lt;/td&gt;
      &lt;td&gt;43.35&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 4&lt;/td&gt;
      &lt;td&gt;73 MB/s&lt;/td&gt;
      &lt;td&gt;2663 MB/s&lt;/td&gt;
      &lt;td&gt;384213411&lt;/td&gt;
      &lt;td&gt;38.42&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 12&lt;/td&gt;
      &lt;td&gt;36 MB/s&lt;/td&gt;
      &lt;td&gt;2706 MB/s&lt;/td&gt;
      &lt;td&gt;374049977&lt;/td&gt;
      &lt;td&gt;37.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lz4hc r131 level 16&lt;/td&gt;
      &lt;td&gt;36 MB/s&lt;/td&gt;
      &lt;td&gt;2715 MB/s&lt;/td&gt;
      &lt;td&gt;374049340&lt;/td&gt;
      &lt;td&gt;37.40&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse2 0.1&lt;/td&gt;
      &lt;td&gt;0.14 MB/s&lt;/td&gt;
      &lt;td&gt;3836 MB/s&lt;/td&gt;
      &lt;td&gt;340268143&lt;/td&gt;
      &lt;td&gt;34.03&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse4 0.1&lt;/td&gt;
      &lt;td&gt;220 MB/s&lt;/td&gt;
      &lt;td&gt;3322 MB/s&lt;/td&gt;
      &lt;td&gt;425848263&lt;/td&gt;
      &lt;td&gt;42.58&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;lzsse8 0.1&lt;/td&gt;
      &lt;td&gt;225 MB/s&lt;/td&gt;
      &lt;td&gt;3214 MB/s&lt;/td&gt;
      &lt;td&gt;427471454&lt;/td&gt;
      &lt;td&gt;42.75&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;future-work&quot;&gt;Future Work&lt;/h2&gt;
&lt;p&gt;Currently, this experiment is pretty young and I’m sure there are plenty of potential improvements and optimizations I haven’t yet thought of.&lt;/p&gt;

&lt;p&gt;Here are a few I have:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;An adaptive threshold that tries to balance between match and literal lengths in controls, to be able to copy the maximum amount of bytes on average per decompression step, as well to get some wins in terms of compression ratio. This is critically important as it will lead to a single codec that is more generically applicable, as well as performing better.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Try and implement something closer to LZ4 with alternating literal length/match sequences instead of the threshold encoding. Should give better performance on literal heavy data, but would require using the carry value for both literals and matches.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Implement a much faster matching algorithm for the optimal parse (suffix array or a much better tree implementation) and add an optimal parse implementation for all variants. Also, generally make the compressors perform better.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Get this working and producing decent machine code on other compilers and OSs (at least clang, other versions of Visual Studio and gcc).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Turning this into an actual production quality library if people are interested.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</description>
                <link>http://ConorStokes.github.io/compression/2016/02/15/an-LZ-codec-designed-for-SSE-decompression</link>
                <guid>http://ConorStokes.github.io/compression/2016/02/15/an-LZ-codec-designed-for-SSE-decompression</guid>
                <pubDate>2016-02-15T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>Horizontal SSE Stable Sort Indice Generation</title>
                <description>
&lt;p&gt;Well, the topic of this blog post is a deceptively simple one; given 4 float values (although you could implement it for integers), in an SSE register, we’re going to perform a stable sort and output the destination indices (from 0 to 3) for the sorted elements in another SSE register, without branches. This came about because I thought it might be useful for some &lt;a href=&quot;https://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.inst.100/institut/Papers/QBVH.pdf&quot;&gt;QBVH&lt;/a&gt; nearest neighbour distance queries I’m potentially going to be implementing.&lt;/p&gt;

&lt;p&gt;I haven’t yet thought about if or how this would be extended to a wider instruction set like AVX, but I don’t think it would be impossible (just hard).&lt;/p&gt;

&lt;h2 id=&quot;the-basic-premise&quot;&gt;The Basic Premise&lt;/h2&gt;
&lt;p&gt;Firstly, in this case, just sorting the keys themselves isn’t enough, we actually want to be able to treat them as keys to re-order &lt;em&gt;another set of values&lt;/em&gt;. To achieve this, we’re going to be producing destination indices (i.e. each original key will have a new “destination” in the sorted output), which can be used either to re-order the original keys, or other values stored in the same order as the original keys.&lt;/p&gt;

&lt;p&gt;Instead of using swap operations, as you would in a regular sorting network implementation, we’re instead going to build the indices using a system where all keys start at index 0, then we increase the index by 1 if it has a “losing” comparison against another key. So, if a key loses a comparison against all 3 other keys, its index will be 3.&lt;/p&gt;

&lt;p&gt;Obviously, a naive implementation of this would have problems with keys that are equal. To get around this, we’re going to implement a simple tie-breaking rule, which is that in the case that the two keys are equal, then the key with the original highest place in the list will lose. This will also give the sort the property of being stable, so values that are equal will maintain their original relative ordering.&lt;/p&gt;

&lt;p&gt;One of the interesting things about this is that because the operation of changing the relative orders is associative (adding 1 to the index), it does not matter if we use the same key in multiple comparisons at once, because we can combine the offsets to the indices at the end.&lt;/p&gt;

&lt;p&gt;So, assuming an ascending sort, we’ll do two “rounds” of comparisons (considering we can do 4 at once). Each comparison will be a greater than (with the value with the lower “original” index being the left operand and the higher the second operand). This means if the left value is greater than the first, its output index will be incremented by one, but if the right value is greater than or equal to the first, its output index will be incremented.&lt;/p&gt;

&lt;p&gt;The first round looks like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;key[ 0 ] &amp;gt; key[ 1 ]
key[ 1 ] &amp;gt; key[ 2 ]
key[ 2 ] &amp;gt; key[ 3 ]
key[ 0 ] &amp;gt; key[ 3 ]  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The second round looks like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;key[ 0 ] &amp;gt; key[ 2 ]
key[ 1 ] &amp;gt; key[ 3 ]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;the-implementation&quot;&gt;The Implementation&lt;/h2&gt;

&lt;p&gt;The total implementation (for the actual sorting algorithm, not counting loading the input, storing the output indices or loading constants, because they are assumed to be done out of loop) comes in at 14 operations and only requires SSE2. The operation counts are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2 adds&lt;/li&gt;
  &lt;li&gt;2 and&lt;/li&gt;
  &lt;li&gt;1 and not&lt;/li&gt;
  &lt;li&gt;5 shuffles&lt;/li&gt;
  &lt;li&gt;2 greater than compares&lt;/li&gt;
  &lt;li&gt;2 xors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll explain the implementation step by step…&lt;/p&gt;

&lt;p&gt;First, we load the constants. My assumption for the algorithm is that these will be done out of loop and be kept in registers (which will be the case for my implementation, but may not always be true):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i flip1 = _mm_set_epi32( 0xFFFFFFFF, 0, 0, 0 );
__m128i flip2 = _mm_set_epi32( 0xFFFFFFFF, 0xFFFFFFFF, 0, 0 );
__m128i mask1 = _mm_set1_epi32( 1 );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now for the actual sorting algorithm itself. First we shuffle the input to setup the first round of comparisons:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128 left1  = _mm_shuffle_ps( input, input, _MM_SHUFFLE( 0, 2, 1, 0 ) );
__m128 right1 = _mm_shuffle_ps( input, input, _MM_SHUFFLE( 3, 3, 2, 1 ) );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After that, we compare the first values and increment the indices of the losers. Note, there are 8 possible losers in the set (and 4 actual losers), so we will have two 4 element registers as the output for this step (with each element either being 1 or 0). Because there are instances where we reference the same key twice (on both sides) in this set of comparisons and we want to do the increments for the “losing” keys in parallel (where we can’t add 2 source elements from the register into one destination), we use an xor to flip the bits for the last element, effectively switching the potential loser at element 3, with the potential loser at element 0. This also avoids a shuffle on the first set of loser increments, because they are already arranged in the right order. Note that the losers on one side of the comparison match up with the winners on the other (we just need to shuffle them to the appropriate places).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i tournament1 = _mm_castps_si128( _mm_cmpgt_ps( left1, right1 ) ); 
__m128i losers1     = _mm_xor_si128( tournament1, flip1 );
__m128i winners2    = _mm_shuffle_epi32( losers1, _MM_SHUFFLE( 2, 1, 0, 3 ) );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Because our comparisons result in 0xFFFFFFFF instead of 1, we mask out everything but the bottom bit (because we only want to increment by 1). We convert the winners to losers (with a complement) and mask out the bits in a single step using the and-not instrinsic/instruction.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i maskedLosers1 = _mm_and_si128( losers1, mask1 );
__m128i maskedLosers2 = _mm_andnot_si128( winners2, mask1 );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next, we need to do the second round of comparisons. This time we only have 2 comparisons and 4 possible losers (of which 2 will actually be losers). Also luckily, the four possible losers are each one of the four keys. This time what we’re going to do is double up on the comparisons (doing each one twice, but all the results in one register), but then flip the results for the top two, before masking the values to 1.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i tournament2   = _mm_castps_si128( _mm_cmpgt_ps( left2, right2 ) );
__m128i losers3       = _mm_xor_si128( tournament2, flip2 );
__m128i maskedLosers3 = _mm_and_si128( losers3, mask1 );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Finally, we will add all the masked losers together, like a failed superhero convention:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i indices = _mm_add_epi32( _mm_add_epi32( maskedLosers1, maskedLosers2 ), maskedLosers3 );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now if you want to, you can take 4 unsorted values (in the same order as the keys) and scatter them using these indices. Unfortunately SSE doesn’t have any gather/scatter functionality, so you’ll have to do that bit the old fashioned way.&lt;/p&gt;

&lt;h2 id=&quot;have-you-tested-it&quot;&gt;Have You Tested It?&lt;/h2&gt;

&lt;p&gt;Why yes! I have enumerated all possible ordering permutations with repetition (using the values 0.0, 1.0, 2.0 and 3.0). Early performance testing implies low single digit nanoseconds per sort.&lt;/p&gt;

&lt;h2 id=&quot;what-about-nans&quot;&gt;What about NaNs?&lt;/h2&gt;

&lt;p&gt;NaNs aren’t possible in my current use case, so I haven’t walked through all the possibilities yet.&lt;/p&gt;

&lt;h2 id=&quot;update-shaving-off-two-instructions&quot;&gt;Update, Shaving Off Two Instructions!&lt;/h2&gt;

&lt;p&gt;So, a small brainwave, because the compares come out as 0xFFFFFFFF, which is -1 (if we treat them as integers), we can subtract them, instead of adding them, and lose the masking ands. We keep the and-not, because we need the complement (and it saves doing a negate/subtraction from zero). The final composite becomes:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128i indices = _mm_sub_epi32( _mm_sub_epi32( maskedLosers2, losers1 ), losers3 );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Remove the lines calculating maskedLosers1 and maskedLosers3, here is the actual implementation all together, at 12 instructions:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;__m128  left1         = _mm_shuffle_ps( input, input, _MM_SHUFFLE( 0, 2, 1, 0 ) );
__m128  right1        = _mm_shuffle_ps( input, input, _MM_SHUFFLE( 3, 3, 2, 1 ) );
__m128i tournament1   = _mm_castps_si128( _mm_cmpgt_ps( left1, right1 ) ); 
__m128i losers1       = _mm_xor_si128( tournament1, flip1 );
__m128i winners2      = _mm_shuffle_epi32( losers1, _MM_SHUFFLE( 2, 1, 0, 3 ) );
__m128i maskedLosers2 = _mm_andnot_si128( winners2, mask1 );
__m128  left2         = _mm_shuffle_ps( input, input, _MM_SHUFFLE( 1, 0, 1, 0 ) );
__m128  right2        = _mm_shuffle_ps( input, input, _MM_SHUFFLE( 3, 2, 3, 2 ) );
__m128i tournament2   = _mm_castps_si128( _mm_cmpgt_ps( left2, right2 ) );
__m128i losers3       = _mm_xor_si128( tournament2, flip2 );
__m128i indices       = _mm_sub_epi32( _mm_sub_epi32( maskedLosers2, losers1 ), losers3 );
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
                <link>http://ConorStokes.github.io/optimization/2015/09/19/horizontal-sse-stable-sort-indice-generation</link>
                <guid>http://ConorStokes.github.io/optimization/2015/09/19/horizontal-sse-stable-sort-indice-generation</guid>
                <pubDate>2015-09-19T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>SDFs and Hilbert Curves</title>
                <description>
&lt;p&gt;So, this is more of a “thought bubble” blog post than anything concrete yet, but I thought it might be worth some discussion, or at least putting the ideas out there because someone else might find them useful.&lt;/p&gt;

&lt;p&gt;I’ve been thinking a lot lately about the potentials for combining traversals in a &lt;a href=&quot;https://en.wikipedia.org/wiki/Hilbert_curve&quot;&gt;Hilbert curve&lt;/a&gt; ordering with regularly sampled SDFs (signed distance field, which is a sampling of the nearest distance to the surface of an object, with a sign derived from whether the sample is inside or outside the object). Using a Hilbert curve is already a well known technique for improving spatial locality for regularly sampled grids, but there are some properties that apply to SDFs with fairly accurate euclidean distances that sit well with Hilbert curves. Note that what I’m talking about is mainly with 3D SDFs/Hilbert curves in mind, but it applies to 2D as well (as a side note for the pedant in me, if we’re talking higher dimensions, SDFs aren’t really a good idea).&lt;/p&gt;

&lt;p&gt;The main property of the Hilbert ordering we’re interested in is that unlike other orderings, for example the Morton/Z-Curve, Hilbert provides an ordering where each consecutive grid point is rectilinearly adjacent to the previous one (only a single step in a single axis). This also happens to be the minimum distance possible to move between two grid points (for a grid that is uniformly spaced in each axis). A Hilbert curve isn’t the only ordering that provides this property, but it does provide great spatial locality as well.&lt;/p&gt;

&lt;p&gt;There is a simple constraint on euclidean distance functions, which is that the magnitude of the difference of the distance function value between two sample points can’t be greater than the distance between the sample points. This property also holds for signed distance functions and it holds regardless of the magnitude of the distances.&lt;/p&gt;

&lt;p&gt;Add these two little pieces together and there are some “tricks” you can pull.&lt;/p&gt;

&lt;p&gt;One of the first is that if you traverse a SDF’s grid points in Hilbert order, you can delta encode values and know the magnitude of the delta will never be greater than the distance between the two adjacent grid points, meaning that a you can achieve a constant compression ratio that is lossless vs the precision you need to represent the distance field globally (this is without getting into predictors or more advanced transforms). This also works for tiles, where you could represent each tile with one “real” distance value for the first point, along with deltas for the rest of the points, traversing the tile in Hilbert order. This would make the compressed SDF randomly accessible at a tile level (similar to video compression, where you have regular frames that don’t depend on any others, so you can reconstruct without decompressing the whole stream), although you would still potentially have to sample multiple tiles if you wanted to interpolate between points. If you wanted to go further, you could use more general segments of the curve instead of tiles.&lt;/p&gt;

&lt;p&gt;Another neat trick; if you’re building the SDF from base geometry using a search for the nearest piece of geometry at each point and you build traversing in Hilbert, you can both put a low upper bound on the distance you have to search. This is very useful for doing a search in spatial partitions and bounding volume hierarchies, or even probing spatial hashes. You also get the advantage of spatial locality, where you will be touching the same pieces of geometry/your search structure, so they will likely be in your cache (and if you are transforming your geometry to another representation, such as a point based one, you can do it lazily). Also, you can split the work into tiles/segments and process them in parallel.&lt;/p&gt;

&lt;p&gt;This is actually a topic close to my heart, as my first/primary task during my research traineeship at MERL around 15 years ago was investigating robustly turning not-so-well-behaved triangle meshes into a variant of SDFs (adaptively sampled distance fields, or ADFs), which is an area that seems to be drawing a lot of attention again now. &lt;a href=&quot;http://www.sciencedirect.com/science/article/pii/S152407031400037X&quot;&gt;This algorithm&lt;/a&gt; in particular is a neat new approach to this problem.&lt;/p&gt;
</description>
                <link>http://ConorStokes.github.io/geometry/2015/08/07/sdfs-and-hilbert-curves</link>
                <guid>http://ConorStokes.github.io/geometry/2015/08/07/sdfs-and-hilbert-curves</guid>
                <pubDate>2015-08-07T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>Adding Vertex Compression to Index Buffer Compression</title>
                <description>
&lt;p&gt;Index buffer compression is nice (and justifiable), but your average mesh tends to actually have some vertex data that you might want to compress as well. Today we’re going to focus on some simple and generic ways to compress vertex attributes, in the context of the previously discussed &lt;a href=&quot;http://conorstokes.github.io/graphics/2015/03/12/cramming-entropy-encoding-into-index-buffer-compression/&quot;&gt;index buffer compression&lt;/a&gt;, to turn our fairly small and fast index buffer compression/decompression into more complete mesh compression.&lt;/p&gt;

&lt;p&gt;In this case, we’re going to focus on a simple and fairly general implementation that favours simplicity, determinism and running performance over the best compression performance.&lt;/p&gt;

&lt;p&gt;As with previous posts, the source code for this one is available on &lt;a href=&quot;https://github.com/ConorStokes/MeshCompression&quot;&gt;github&lt;/a&gt;, but in this case I’ve forked the repository (to keep the original index buffer implementation separate for now) and it isn’t yet as polished yet as the index buffer compression repository.&lt;/p&gt;

&lt;h2 id=&quot;compressing-vertices&quot;&gt;Compressing Vertices&lt;/h2&gt;

&lt;p&gt;When it comes to compression of this kind of data, the general approach is to use a combination of &lt;a href=&quot;http://en.wikipedia.org/wiki/Quantization_(signal_processing)&quot;&gt;quantization&lt;/a&gt; (trading precision for less trailing digits) and taking advantage of coherence with transforms/predictions that we can use to skew the probability distribution of the resulting quantities/residuals for entropy encoding. We’ll be using both here to achieve our goals.&lt;/p&gt;

&lt;h2 id=&quot;quantization&quot;&gt;Quantization&lt;/h2&gt;

&lt;p&gt;With this implementation we’re actually going to be a bit sneaky and shift the responsibility for quantization outside the main encoder/decoder. Part of the reason for this is that it allows downstream users the ability to choose their own quantization scheme and implement custom pre-transforms (for example, for my test cases, I transformed normals from a 3 component unit vector to a more effective octahedron format). Another part of the reason is that some of the work can be shifted to the vertex shader.&lt;/p&gt;

&lt;p&gt;The encoder is designed to take either 16 bit or 32bit integers, where the values have already undergone quantization and had their range reduced (the maximum supported range is -2^29 to 2^29 - 1, which is limited by a mix of the prediction mechanism, which can have an residual range larger than the initial values, as well as the coding mechanism used). The compression after quantization is bit exact, so the exact same integers will come out the other side. This has some advantages if some of your attributes are indices that need to be exact, but are still compressible because connected vertices have similar values.&lt;/p&gt;

&lt;p&gt;The first iteration of the mesh compression library doesn’t actually contain the quantization code yet, only the main encoder and decoder. For positions (and this would apply to texture coordinates as well), quantization was done by taking the floating point components and their bounding box, subtracting the minimum in each axis, then dividing by the largest range of any axis (to maintain aspect ratio) and then scaling and biasing into the correct range and rounding to the nearest integer.&lt;/p&gt;

&lt;h2 id=&quot;prediction&quot;&gt;Prediction&lt;/h2&gt;

&lt;p&gt;One of the unfortunate things about vertices is that in a general triangle mesh, they have very little in the way of implicit structuring that makes them compressible by themselves. When you are compressing audio/time series data, images, voxels or video, the samples are generally coherent and regular (in a hyper-grid), so you can apply transforms that take advantage of that combination of regular sampling and coherence.&lt;/p&gt;

&lt;p&gt;There are ways we can impose structure on the vertex data (for example, re-ordering or clustering), but this would change the order of the vertices (the ordering of which we already rely on when compressing connectivity). As an aside, for an idea of what regularly structured geometry would entail, check out &lt;a href=&quot;http://research.microsoft.com/en-us/um/people/hoppe/proj/gim/&quot;&gt;geometry images&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We do however have some explicit structuring, in terms of the connectivity information (the triangle indices), that we can use to imply relationships between the vertices. For example, we know that vertices on the same edge are likely close to each other (although, not always), which could enable a simple delta prediction, as long as we always had a vertex that shared an edge decompressed before hand.&lt;/p&gt;

&lt;p&gt;Taking this further, if we have a triangle on an opposing edge to the vertex in question, we can use the &lt;a href=&quot;http://www.cs.technion.ac.il/~gotsman/AmendedPubl/TriangleMesh/Convert-Triangle.pdf&quot;&gt;parallelogram predictor&lt;/a&gt; (pictured below) introduced by Touma and Gotsman. If you have followed any of the discussions between &lt;a href=&quot;https://twitter.com/won3d&quot;&gt;Won Chun&lt;/a&gt; and myself on twitter, or have looked into mesh compression yourself, this probably won’t be new to you. The predictor itself involves extending the triangle adjacent the edge opposing the vertex and extending it like a parallelogram.&lt;/p&gt;

&lt;div style=&quot;text-align:center&quot;&gt;
&lt;p&gt;
&lt;img src=&quot;http://conorstokes.github.io/images/parallelogram.png&quot; alt=&quot;The Parallelogram Predictor&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-style: italic; font-weight: bold&quot;&gt;1. The Parallelogram Predictor&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;It turns out we can implement these predictors with only a small local amount of connectivity information and if we do them in the same pass as our index buffer encoding/decoding, this information is largely already there. If you recall the &lt;a href=&quot;http://conorstokes.github.io/graphics/2015/03/12/cramming-entropy-encoding-into-index-buffer-compression/&quot;&gt;last post&lt;/a&gt;, most meshes had the vast majority of their triangles coming from an edge in the edge cache, so we can include the index to the third vertex of the triangle that edge came from in the FIFO and use that to perform parallelogram prediction.&lt;/p&gt;

&lt;p&gt;This is fairly standard for mesh compression, as there is nearly always information used in the connectivity encoding that gives you a connected triangle. Some systems go a fair bit further, using full connectivity information and a multiple passes to produce more accurate vertex predictions.&lt;/p&gt;

&lt;p&gt;For the rarer cases where there is not an edge FIFO hit, we can use another vertex in the triangle for delta prediction. It turns out only one vertex case (the first vertex in a new-new-new triangle) does not have a vertex relatively available to predict from. One of the advantages for this is that it keeps our compression working in the case where we don’t have many shared edges, albeit less efficiently.&lt;/p&gt;

&lt;p&gt;One of the limitations of the parallelogram predictor is that the point it predicts is on the same plane as the triangle the prediction was based on. This means if your mesh has a large curve, there will be a reasonable amount of error. There are multiple ways to get around this problem; the original Touma and Gotsman paper used the 2 previously decoded edges closest to the direction of the edge adjacent the vertex to be decoded and averaged the “crease” direction of the triangles, then applied this to move the prediction. Other papers have used estimates from other vertices in the neighborhood and used more complex transform scheme. One paper transformed all the vertices to a basis space based on the predicting triangle, ran k-means to produce a limited set of prediction points, then encoded the index to the closest point along with the error. There are many options for improving the general prediction.&lt;/p&gt;

&lt;p&gt;For my purposes though, I’m going to make an engineering decision to trade off a bit of compression for simplicity in the implementation and stick with the bare bones parallelogram predictor. There are a couple of reasons for this; firstly, it’s very easy to make the bare bones predictor with simple integer arithmetic (deterministic, fast and exact). You can apply it for each component, without referencing any of the others, and it works passing well for things like texture coordinates and some normal encodings.&lt;/p&gt;

&lt;p&gt;One of the advantages about working with a vertex cache optimized ordering is that the majority of connected vertices have been recently processed, meaning they are likely in the cache when we reference them for decompression.&lt;/p&gt;

&lt;h2 id=&quot;entropy-encoding&quot;&gt;Entropy Encoding&lt;/h2&gt;

&lt;p&gt;Now, entropy encoding for the vertex data is quite a different proposition to what we used for connectivity data. Firstly, we aren’t using a set quantization pass, so straight up the probability distribution of our input is going to vary quite a lot. Secondly, as the distance between vertices in different meshes varies quite a lot, prediction errors are probably going to vary quite a lot. Thirdly, even with good predictors on vertex data you can have quite large errors for some vertices. All of this means that using a static probability distribution for error residuals is not going to fly.&lt;/p&gt;

&lt;p&gt;Let’s look at the number of occurrences for residuals just for the parallelogram predictor, for the bunny model vertex positions, at 14 bits a component (graph below). We’ve applied a &lt;a href=&quot;https://developers.google.com/protocol-buffers/docs/encoding?csw=1&quot;&gt;ZigZag&lt;/a&gt; encoding, such as used in protocol buffers, to allow us to encode negative residuals as positive numbers. The highest residual is 1712 (although there are many residuals below that value that don’t occur at all) and the number of unique residuals that occur is 547.&lt;/p&gt;

&lt;div style=&quot;text-align:center&quot;&gt;
&lt;p&gt;
&lt;img src=&quot;http://conorstokes.github.io/images/bunny_residuals.png&quot; alt=&quot;The Error Residuals for Vertex Positions of the Bunny Mesh&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-style: italic; font-weight: bold&quot;&gt;2. The Error Residuals for Vertex Positions of the Bunny Mesh&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;A fairly standard approach here would be to calculate the error residuals in one pass, while also calculating a histogram, which we could then use to build a probability distribution for a traditional entropy encoder, where we could encode the vertices in a second pass. This introduces another pass in encoding (we’ve already introduced one potentially for quantization), as well as the requirement to buffer residuals. It also means storing a code table (or probabilities/frequencies) in the compression stream. For our connectivity compressor we used Huffman and a table driven decoder, lets look at how that approach would work here.&lt;/p&gt;

&lt;p&gt;If we feed the above data into a Huffman code generator, we end up with the longest code being 17bits, meaning we would need a table of 131072 entries (each of which would be larger than for our connectivity compression, because the residuals themselves are larger than a byte). That’s a bit steeper than our connectivity compression, but we could get the table size down using the approach outlined in Moffat and Turpin’s &lt;a href=&quot;http://www.eecs.harvard.edu/~michaelm/E210/huffman.pdf&quot;&gt;On the Implementation of Minimum Redundancy Prefix Codes&lt;/a&gt; paper, at the cost of an increase in complexity of the decoder. However, other models/quantization levels might require even larger tables.&lt;/p&gt;

&lt;p&gt;But how would compression be? For just the position residuals for the parallelogram predicted vertices (which is 34634 of 34817 vertices) we would use 611,544 bits (not counting the code/frequency table, which would also be needed). That’s reasonable at 17.66 bits a vertex, or 5.89 bits a component (down from 14).&lt;/p&gt;

&lt;p&gt;The compression is reasonable for this method (which we would expect, given it’s pedigree). But it brings with it some disadvantages; an extra encoding pass and buffering, storing a code table, extra complexity or a large decoding table as well as some overhead in decoding to build the decoding table.&lt;/p&gt;

&lt;p&gt;Let’s take a different approach.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Universal_code_(data_compression)&quot;&gt;Universal codes&lt;/a&gt; allow any integer to be encoded, but each code ends up with an implied probability correlated to how many bits it uses. You can use them for fairly general entropy encoding where you know the rank of a set of codes, but they don’t perform as well as Huffman coding usually, because the probability distribution of real codes usually doesn’t match that of the universal codes exactly.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Exponential-Golomb_coding&quot;&gt;Exponential-Golomb&lt;/a&gt; codes are a kind of universal code with some interesting properties. They combine an &lt;a href=&quot;http://en.wikipedia.org/wiki/Elias_gamma_coding&quot;&gt;Elias gamma&lt;/a&gt; code to represent the most significant bits of a value, with a fixed number of the lowest significant bits (k) encoded directly. Also, I dare you to try and type “Golomb” without inserting a “u”. The first part of the code is a unary code that will have quite a limited number of bits for our range of values, which we can use a bit scan instruction to decode instead of a table lookup, so we can build a fast decoder without running into memory problems (or cache miss problems).&lt;/p&gt;

&lt;p&gt;Now, it turns out this is a good model for the case where you have a certain number of low bits which have approximately a uniform probability distribution (so they are quite noisy), with the bits above the k’th bit being increasingly unlikely to be switched on. The shortest length codes for a particular value are produced when the most significant bit also happens to be the top bit in a k-bits integer.&lt;/p&gt;

&lt;p&gt;So, if we can correctly estimate what k should be for a particular component residual at a particular time, then we can get the best bit length encoding for that value. If we make the (not always correct) assumption that the traversal order of vertices means that similar vertices will be close together and that the residuals for each component are probably going to be similar in magnitude, then a moving average based off what the optimal k for the previous values were might be a reasonable way to estimate an optimal k (a kind of adaptive scheme, instead of a fixed code book).&lt;/p&gt;

&lt;p&gt;I decided to go with an &lt;a href=&quot;http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average&quot;&gt;exponential moving average&lt;/a&gt;, because it requires very little state, no lookbacks and we can calculate certain exponential moving averages easily/quickly in fixed point (which we really want, for determinism, as we want to be able to reproduce the exact same k on decompression). After some experimentation and keeping in mind what we can calculate with shifts, I decided to go with an alpha of 0.125. In 16/16 fixed point, the moving average looks like this (where kEstimate is the k that would give the best encoding for the current value):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;k = ( k * 7 + ( kEstimate &amp;lt;&amp;lt; 16 ) ) &amp;gt;&amp;gt; 3;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Also, after a bit of experimentation, I went with a bit of a simplified version of exponential golomb coding that has a slightly better probability distribution (for our purposes) and is slightly faster to decode. Our code will have a unary code starting from the least significant bits, where the number of zeros will encode the number of bits above k that our residual will have. If that number is 0, what will follow will be k bits (representing the residual, padded out with zeros in the most significant bits to k bits). If it is more than zero, after will follow the residual without the most significant bit (which will be implied by the position we can calculate from the unary code).&lt;/p&gt;

&lt;p&gt;Below are simplified versions of the encoding and decoding functions for this universal code. Note that we return the number of bits from writing the value, so we can feed it into the moving average as our estimate for k. The DecodeUniversal in this case uses the MSVC intrinsic for the bit scan, but in our actual implementation we also support the __builtin_ctz intrinsic from gcc/clang and a portable fallback (although, I need to test these platforms properly).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;inline uint32_t WriteBitstream::WriteUniversal( uint32_t value, uint32_t k )
{
    uint32_t bits = Log2( ( value &amp;lt;&amp;lt; 1 ) | 1 );

    if ( bits &amp;lt;= k )
    {
        Write( 1, 1 );
        Write( value, k );
    }
    else
    {
        uint32_t bitsMinusK = bits - k;

        Write( uint32_t( 1 ) &amp;lt;&amp;lt; bitsMinusK, bitsMinusK + 1 );
        Write( value &amp;amp; ~( uint32_t( 1 ) &amp;lt;&amp;lt; ( bits - 1 ) ), bits - 1 );
    }

    return bits;
}

inline uint32_t ReadBitstream::DecodeUniversal( uint32_t k )
{
    if (m_bitsLeft &amp;lt; 32)
    {
        uint64_t intermediateBitBuffer = 
            *( reinterpret_cast&amp;lt; const uint32_t* &amp;gt;( m_cursor ) );
        
        m_bitBuffer |= intermediateBitBuffer &amp;lt;&amp;lt; m_bitsLeft;

        m_bitsLeft  += 32;
        m_cursor    += 4;
    }

    unsigned long leadingBitCount;

    _BitScanForward( &amp;amp;leadingBitCount, 
                     static_cast&amp;lt; unsigned long &amp;gt;( m_bitBuffer ) );

    uint32_t topBitPlus1Count = leadingBitCount + 1;

    m_bitBuffer &amp;gt;&amp;gt;= topBitPlus1Count;
    m_bitsLeft   -= topBitPlus1Count;

    uint32_t leadingBitCountNotZero = leadingBitCount != 0;
    uint32_t bitLength              = k + leadingBitCount;
    uint32_t bitsToRead             = bitLength - leadingBitCountNotZero;

    return Read( bitsToRead ) | ( leadingBitCountNotZero &amp;lt;&amp;lt; bitsToRead );
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There are a few more computations here than in a table driven Huffman decoder, but we get away without the table look-up memory access and the cache miss that could bring for larger tables. I am a fan of the adage “take me down to cache miss city where computation is cheap but performance is shitty”, so this sits a bit better with my performance intuitions for potentially unknown future usage.&lt;/p&gt;

&lt;p&gt;But what sort of compression do we get? It turns out for this particular case, although definitely not all cases, our adaptive universal scheme actually outperforms Huffman, with a total of 604,367 bits (17.45 bits a vertex or 5.82 bits a component). You might ask how, given Huffman produces optimal codes (for whole bit codes) that we managed to beat it; the answer is that less optimal adaptive coding can beat better codes with a fixed probability distribution. In some cases it performs a few percent worse, but overall it’s competitive enough that I believe the trade offs for encoder/decoder simplicity and performance are worth it.&lt;/p&gt;

&lt;h2 id=&quot;encoding-normals&quot;&gt;Encoding Normals&lt;/h2&gt;

&lt;p&gt;For encoding vertex normals I use the precise Octahedral encoding described in &lt;a href=&quot;http://jcgt.org/published/0003/02/01/paper.pdf&quot;&gt;A Survey of Efficient Representations for Unit Vectors&lt;/a&gt;. This encoding works relatively well with parallelogram prediction, but has the problem of strange wrapping on the edges of the mapping, which makes prediction fail at the borders, meaning vertices on triangles that straddle those edges can end up with high residual values. However, the encoding itself is good enough it can stand up to a reasonable amount of quantization.&lt;/p&gt;

&lt;p&gt;Because this encoding is done in the quantization pass (outside of the main encoder/decoder), it’s pretty easy to drop in other schemes of your own making.&lt;/p&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;

&lt;p&gt;For now, I’m going to stick to just encoding positions and vertex normals (apart from the Armadillo mesh, which doesn’t have normals included), because the meshes we’ve been using for results up until this point don’t have texture coordinates. At some stage I’ll see about producing some figures for meshes with texture coordinates (and maybe some other vertex attributes).&lt;/p&gt;

&lt;p&gt;First let’s look at the compression results for vertex positions at 10 to 16 bit per component. Results are given in average bits per component, to get the amount of storage for the final mesh, multiply the value by the number of vertices times 3. Note that the number for 14 bit components is slightly higher than that given earlier, because this includes all cases, not just those using parallelogram prediction.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;MODEL  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  VERTICES  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  10 bit  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  11 bit  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  12 bit  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  13 bit&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  14 bit&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  15 bit&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  16 bit&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bunny&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  34,817&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  2.698&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  3.280&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  4.049&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  4.911&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  5.842&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  6.829&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.828&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Armadillo&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  172,974&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  2.231&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  2.927&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  3.765&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  4.553&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  5.466&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  6.290&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.209&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Dragon&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  438,976&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  2.640&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  3.438&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  4.297&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  5.292&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  6.306&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.327&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  8.351&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Buddha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  549,409&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  2.386&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  3.123&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  4.037&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  5.014&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  6.017&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.032&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  8.055&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Now lets look at normals for bunny, dragon and buddha, from 8 to 12 bits a component, using the precise octahedral representation (2 components). Note that the large predictions errors for straddling edges cause these to be quite a bit less efficient than positions, although normals do not predict as well with the parallelogram predictor in general.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;MODEL  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  VERTICES  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  8 bit  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  9 bit  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  10 bit  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  11 bit&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  12 bit&lt;/th&gt;
      &lt;th&gt; &lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bunny&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  34,817&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  4.840&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  5.817&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  6.813&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.814&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  8.816&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Dragon&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  438,976&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  4.291&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  5.255&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  6.250&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.251&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  8.252&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Buddha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  549,409&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  4.664&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  5.632&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  6.627&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.627&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  8.628&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Now, let’s look at decompression speeds. Here are the speeds for the Huffman table driven index buffer compression alone. Note, there has been one or two optimisations since last time that got the speed closer to the fixed width code version.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;MODEL  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  TRIANGLES  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  UNCOMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  COMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  COMPRESSION TIME  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (MIN)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (AVG)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (MAX)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (STD-DEV)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bunny&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  69,630&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  835,560&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  70,422&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  2.71ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.551ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.578ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.623ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.030ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Dragon&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  871,306&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  10,455,672&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  875,771&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  31.7ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.18ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.22ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.46ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.060ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Buddha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,087,474&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  13,049,688&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,095,804&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  38.9ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  8.98ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  9.02ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  9.25ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.058ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Here are the figures where we use quantization to reduce vertices down to 14 bits a component and normals encoded as described above in 10 bits a component, then run them through our compressor. Timings and compressed size include connectivity information, but timings don’t include the quantization pass. Uncompressed figures are for 32 bit floats for all components, with 3 component vector normals.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;MODEL  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  TRIANGLES  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  UNCOMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  COMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  COMPRESSION TIME  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (MIN)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (AVG)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (MAX)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (STD-DEV)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bunny&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  69,630&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,671,168&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  206,014&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  5.20ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  1.693ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  1.697ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  1.795ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.015ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Dragon&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  871,306&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  20,991,096&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  2,598,507&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  62.87ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  21.25ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  21.29ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  21.36ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.015ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Buddha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,087,474&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  26,235,504&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  3,247,973&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  79.75ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  26.83ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  27.00ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  28.79ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.44ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Also, &lt;a href=&quot;http://conorstokes.github.io/meshcomparison/index.html&quot;&gt;here’s an interactive demonstration&lt;/a&gt; that shows the relative quality of a mesh that has been round-tripped through compression with 14 bit component positions/10 bit component normals as outlined above (warning, these meshes are downloaded uncompressed, so they are several megabytes).&lt;/p&gt;

&lt;p&gt;At the moment, I think there is still some room for improvement, both compression wise and performance wise. However, I do think it’s close enough in both ballparks to spark some discussions of the viability. One of the things to note is that the compression functions still provide the vertex re-mapping, so it is possible to store vertex attributes outside of the compressed stream.&lt;/p&gt;

&lt;p&gt;It should be noted, the connectivity compression doesn’t support degenerate triangles (a triangle with two or more of the same vertex indices), which is still a limitation. As these triangles don’t add anything visible to a mesh, it is usually alright to remove them, but there are some techniques that might take advantage of them.&lt;/p&gt;

&lt;h2 id=&quot;a-quick-word-on-an-interesting-variant&quot;&gt;A Quick Word on an Interesting Variant&lt;/h2&gt;

&lt;p&gt;I haven’t investigated this thoroughly, but there is an interesting variant of the compression that gets rid of the free vertex (vertex cache miss) cases and treats them the same as a new vertex case. This would mean encoding some vertices twice, but as the decoding is bit exact the end result would be the same. Because these vertex reads are less frequent than their new vertex cousins (less than a third than in the bunny), it means that the overhead would be relatively small and still a fair bit smaller than the uncompressed result (and you would gain something back on the improved connectivity compression). However, it would mean that you could decode vertices only looking at those referenced by the FIFOs (which would be whole triangles in the case of the edge FIFOs) and that essentially you could reduce processing/decompression to a small fixed size decompression state and always forward reading from the compressed stream.&lt;/p&gt;

&lt;p&gt;The requirement for large amounts of state (of potentially unknown size), as well as large tables for Huffman decoding, is part of what has made hardware support for mesh decompression a non-starter in the past.&lt;/p&gt;

&lt;h2 id=&quot;wrapping-up&quot;&gt;Wrapping Up&lt;/h2&gt;

&lt;p&gt;There are a lot of details that didn’t make it into this post, due to to time poverty, so if you are wondering about anything in particular, leave a comment or contact me on &lt;a href=&quot;https://twitter.com/xDirtyPunkx&quot;&gt;twitter&lt;/a&gt; and I will try to fill in the blanks. I was hoping to get more into the statistics behind some of the decisions made (including some interactive 3D graphs made with R/rgl that I have been itching to use), but unfortunately I ran out of time.&lt;/p&gt;

</description>
                <link>http://ConorStokes.github.io/2015/04/28/adding-vertex-compression-to-index-buffer-compression</link>
                <guid>http://ConorStokes.github.io/2015/04/28/adding-vertex-compression-to-index-buffer-compression</guid>
                <pubDate>2015-04-28T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>Cramming Entropy Encoding into Index Buffer Compression</title>
                <description>
&lt;p&gt;I was never really happy with the compression ratio achieved in the &lt;a href=&quot;http://conorstokes.github.io/graphics/2014/09/28/vertex-cache-optimised-index-buffer-compression/&quot;&gt;Vertex Cached Optimised Index Buffer Compression&lt;/a&gt; algorithm, including the improved &lt;a href=&quot;http://conorstokes.github.io/graphics/2014/09/30/better-vertex-cache-optimised-index-buffer-compression/&quot;&gt;version&lt;/a&gt;, even though the speed was good (if you haven’t read these posts, this one might not make sense in places). One of the obvious strategies to improve the compression was to add some form of &lt;a href=&quot;http://en.wikipedia.org/wiki/Entropy_encoding&quot;&gt;entropy encoding&lt;/a&gt;. The challenge was to get a decent boost in compression ratio while keeping decoding and encoding speed/memory usage reasonable.&lt;/p&gt;

&lt;p&gt;Index buffers may not seem at first glance to be that big of a deal in terms of size, but actually they can be quite a large proportion of a mesh, especially for 32bit indices. This is because on average there are approximately 2 triangles for each vertex in a triangle mesh and each triangle takes up 12 bytes.&lt;/p&gt;

&lt;p&gt;Note, for the remainder of this post I’ll be basing the work on the second triangle code based algorithm, that currently does not handle degenerate triangles (triangles where 2 vertices are the same). It is not impossible to modify this algorithm to support degenerates, but that will be for when I have some more spare time.&lt;/p&gt;

&lt;h2 id=&quot;probability-distributions&quot;&gt;Probability Distributions&lt;/h2&gt;

&lt;p&gt;From previous work, I had a hunch about what the probability distribution for the triangle codes was, with the edge/new vertex code being the most likely and the edge/cache code being almost as frequent. During testing, collected statistics showed this was indeed the case. In fact, for the vertex cache optimised meshes tested, over 98% of the triangle codes were one of the edge codes (including edge/free vertex, but in a much lower proportion).&lt;/p&gt;

&lt;p&gt;Entropy encoding on the triangle codes alone wouldn’t be enough to make much of a difference (given the triangle code is only 4 bits and the average triangle about 12.5 in the current algorithm), without reducing the amount of space used by the edge and vertex cache FIFO index entries. Luckily, Tom Forsyth’s vertex cache optimisation algorithm (explained &lt;a href=&quot;https://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html&quot;&gt;here&lt;/a&gt;) is designed to take advantage of multiple potential cache sizes (32 entries or smaller), meaning it biases towards more recent cache entries (as that will cause a hit in both the smaller and larger caches).&lt;/p&gt;

&lt;p&gt;The probability distributions (charted below, averaged over a variety of vertex cache optimised meshes) are quite interesting. Both show a relatively &lt;a href=&quot;http://en.wikipedia.org/wiki/Geometric_distribution&quot;&gt;geometric distribution&lt;/a&gt; with some interesting properties: Vertex FIFO index 0 is a special case, largely due to it being the most common vertex in edge cache hits. Also, the 2 edges usually going into the edge cache for a triangle (the other edge is usually from the cache already) share very similar probabilities, making the distribution step down after every second entry. Overall these distributions are good news for entropy encoding, because all of our most common cases are considerably more frequent than our less common ones.&lt;/p&gt;

&lt;div style=&quot;text-align:center&quot;&gt;
&lt;p&gt;
&lt;img src=&quot;http://conorstokes.github.io/images/edgefifodistribution.png&quot; alt=&quot;Edge FIFO Index Probability Distribution&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-style: italic; font-weight: bold&quot;&gt;1. Edge FIFO Index Probability Distribution&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://conorstokes.github.io/images/vertfifodistribution.png&quot; alt=&quot;Vertex FIFO Index Probability Distribution&quot; /&gt;&lt;br /&gt;
&lt;span style=&quot;font-style: italic; font-weight: bold&quot;&gt;2. Vertex FIFO Index Probability Distribution&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;The probability distributions were similar enough between meshes optimised with Tom’s algorithm that I decided to stick with a static set of probability distributions for all meshes. This has some distinct advantages; there is no code table overhead in the compression stream (important for small meshes) and we can encode the stream in a single pass (we don’t have to build a probability distribution before encoding).&lt;/p&gt;

&lt;p&gt;One of the other things that I decided to do was drop the Edge 0/New Vertex and Edge 1/New Vertex codes, because it was fairly clear from the probability distributions that these codes would actually end up decreasing the compression ratio later on.&lt;/p&gt;

&lt;h2 id=&quot;choosing-a-coding-method&quot;&gt;Choosing a Coding Method&lt;/h2&gt;

&lt;p&gt;Given all of this, it was time to decide on an entropy encoding method. There are a few criterion I had in picking an entropy encoding scheme:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;The performance impact on decoding needed to be small.&lt;/li&gt;
  &lt;li&gt;The performance impact on encoding reasonable enough that on-the-fly encoding was still plausible.&lt;/li&gt;
  &lt;li&gt;Low fixed overheads, so that small meshes were not relatively expensive.&lt;/li&gt;
  &lt;li&gt;Keep the ability to stream out individual triangles (this isn’t implemented, but is not a stretch).&lt;/li&gt;
  &lt;li&gt;Low state overhead (for the above).&lt;/li&gt;
  &lt;li&gt;Switching alphabets/probability distributions multiple times for a single triangle (required because we have multiple different codes per triangle).&lt;/li&gt;
  &lt;li&gt;Single pass for both encoding and decoding (i.e. no having to buffer up intermediates).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Traditionally the tool for a job like this would be a prefix coder, using Huffman codes. After considering the alternatives, this still looked like the best compromise, with ANS requiring the reverse traversal (meaning two passes for encoding) and other arithmetic and range encoding variants being too processor intensive/a pain to mix alphabets. Another coding considered was a word aligned coding that used the top bits of a word (32 or 64 bits) to specify the bit width of codes put into the rest of the word. This coding is simple, but would require some extra buffering on encoding.&lt;/p&gt;

&lt;p&gt;After generating the codes for the probability distributions above, I found the maximum code-lengths for the triangle codes were 11 bits. One of the things about the triangle codes was that there were a fair few codes that were rare enough that they were essentially noise, so I decided to smooth the probability distribution down a bit at the tail (a kind of manual length limiting, although it’s perfectly possible to generate length limited Huffman codes), which reduced the maximum code lengths to 7 bits, with the 3 most common cases taking up 1, 2 or 3 bits respectively (edge/new, edge/cached, edge/free).&lt;/p&gt;

&lt;p&gt;The edge FIFO indices came in at a maximum code length of 11 bits (with the most common 9 codes coming in between 2 and 5 bits) and the vertex FIFO indices came in with a maximum length of 8 bits (with the 7 most common codes coming in between 1 and 5 bits).&lt;/p&gt;

&lt;h2 id=&quot;implementing-the-encoderdecoder&quot;&gt;Implementing the Encoder/Decoder&lt;/h2&gt;

&lt;p&gt;Because the probability distributions are static, for the encoder we can just embed static/constant tables, mapping symbols to codes and code-lengths. These could then be output using the same bitstream code used by the old algorithm.&lt;/p&gt;

&lt;p&gt;For the decoder, I decided to go with a purely table driven approach as well (it’s possible to implement hybrid decoders that are partially table driven, with fall-backs, but that would’ve complicated the code more than I would’ve liked). This method uses a table able to fit the largest code as an index and enumerates all the variants for each prefix code. This was an option because the maximum code lengths for the various alphabets were quite small, meaning that the largest table would have 2048 entries (and the smallest, 128). These tables are embedded in the code and are immutable.&lt;/p&gt;

&lt;p&gt;To cut down on table space as much as possible (to be a good cache using citizen), each table entry contained two 1 byte values (the original symbol and the length of the code). In total, this means 2432 decoding table entries (under 5K memory use).&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;struct PrefixCodeTableEntry
{
    uint8_t original;
    uint8_t codeLength;
};
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Symbols were encoded with the first bit in the prefix starting in the least significant bit. This made the actual table decoding code very simple and neat. The decoding code was integrated directly with the reading of the bit-stream, which made mixing tables for decoding different alphabets (as well as the var-int encodings for free-vertices) far easier than if each decoder was maintaining.&lt;/p&gt;

&lt;p&gt;Here is a simplified version of the decoding code:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;inline uint32_t ReadBitstream::Decode( const PrefixCodeTableEntry* table, uint32_t maxCodeSize )
{
    if ( m_bitsLeft &amp;lt; maxCodeSize )
    {
        uint64_t intermediateBitBuffer = *(const uint32_t*)m_cursor;
        
        m_bitBuffer |= intermediateBitBuffer &amp;lt;&amp;lt; m_bitsLeft;
        m_bitsLeft  += 32;
        m_cursor    += sizeof(uint32_t);
    }
    
    uint64_t                    mask       = ( uint64_t( 1 ) &amp;lt;&amp;lt; maxCodeSize ) - 1;
    const PrefixCodeTableEntry&amp;amp; codeEntry  = table[ m_bitBuffer &amp;amp; mask ];
    uint32_t                    codeLength = codeEntry.codeLength;

    m_bitBuffer &amp;gt;&amp;gt;= codeLength;
    m_bitsLeft   -= codeLength;

    return codeEntry.original;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Because m_bitBuffer is 64bits wide and the highest maxCodeSize in our case is 11 bits, we can always add in another 32bits at a time into the buffer without overflowing when we have less than the maximum code size left. This guarantees that we will always have at least the maximum code length of bits in the buffer, before we try and read from the table. I’ve used a 32 bit read from the underlying data here (which brings up endian issues etc), but the actual implementation only does this as a special case for x86/x64 currently (manually constructing the intermediate byte by byte otherwise).&lt;/p&gt;

&lt;p&gt;Because we are always shifting codeLength bits out of the buffer afterwards, the least significant bits of the bit buffer will always contain the next code when we do the table read. The mask is to make sure we only use the maximum code length of bits to index the decoding table. With inlining (which we get a bit heavy handed with forcing in the implementation), the calculation of the mask should collapse down to a constant.&lt;/p&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;

&lt;p&gt;Since &lt;a href=&quot;http://conorstokes.github.io/graphics/2014/09/30/better-vertex-cache-optimised-index-buffer-compression/&quot;&gt;last time&lt;/a&gt; there has been some bug fixes and some performance improvements for the triangle code algorithm (and I’ve started compiling in x64, which I should’ve been doing all along), so I’ll present the improved version as a baseline (all results are on my i7 4790K on Windows, compiled with Visual Studio 2013). Here we use 32 runs to get a value:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;MODEL  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  TRIANGLES  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  UNCOMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  COMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  COMPRESSION TIME  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (MIN)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (AVG)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (MAX)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (STD-DEV)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bunny&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  69,630&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  835,560&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  108,908&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  2.42ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.552ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.558ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.599ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.0086ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Armadillo&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  345,944&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  4,151,328&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  547,781&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  12.2ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  2.81ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  2.82ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  2.86ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.0103ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Dragon&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  871,306&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  10,455,672&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,363,265&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  35.2ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.22ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.27ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  7.51ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.0724ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Buddha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,087,474&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  13,049,688&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,703,928&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  38.8ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  9.01ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  9.04ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  9.176ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.0304ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;So, our baseline is a fair bit faster than before. Throughput is currently sitting over 122 million triangles a second (on a single core), which for 32bit indices represents a decoding speed of ~1,400MiB/s and about 12.5 bits a triangle. Here’s the new entropy encoding variant:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;MODEL  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  TRIANGLES  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  UNCOMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  COMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  COMPRESSION TIME  &lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (MIN)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (AVG)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (MAX)&lt;/th&gt;
      &lt;th style=&quot;text-align: center&quot;&gt;  DECOMPRESSION TIME (STD-DEV)&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bunny&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  69,630&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  835,560&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  70,422&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  2.52ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.827ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.828ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.844ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.0029ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Armadillo&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  345,944&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  4,151,328&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  354,843&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  12.1ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  4.15ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  4.17ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  4.27ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.0303ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Dragon&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  871,306&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  10,455,672&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  875,771&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  31.8ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  10.6ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  10.64ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  10.82ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.0497ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Buddha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,087,474&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  13,049,688&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,095,804&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  38.7ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  13.25ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  13.28ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  13.788ms&lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt;  0.0687ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: center&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The new algorithm has throughput of a bit over 82 million triangles a second (so about 67% the throughput, ~940MiB/s), but gets very close to 8bits a triangle (so about 64% the size). There is virtually no overhead in the encoding time (with it even being slightly faster at times), probably due to less bits going into the bitstream. Considering our most common case in the old algorithm (edge/new vertex) was 9 bits, this is a considerable gain compression wise.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Overall, this algorithm is still not near the best indice compression algorithms in terms of compression ratio (which get less than a bit a triangle, when using adaptive arithmetic encoding), however it is fast, relatively simple (I don’t think an implementation in hardware would be impossible), requires very little in the way of state overhead/supporting data-structures/connectivity information and allows arbitrary topologies/triangle orderings (other algorithms often change the order of the triangles). Although, it is obviously focused on vertex cache optimised meshes, which happens to be the triangle ordering people want meshes in. The next step is probably to add vertex compression and create a full mesh compression algorithm, as well as handling degenerates with this algorithm.&lt;/p&gt;

&lt;p&gt;As usual, the code for this implementation can be seen on &lt;a href=&quot;https://github.com/ConorStokes/IndexBufferCompression&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
</description>
                <link>http://ConorStokes.github.io/graphics/2015/03/12/cramming-entropy-encoding-into-index-buffer-compression</link>
                <guid>http://ConorStokes.github.io/graphics/2015/03/12/cramming-entropy-encoding-into-index-buffer-compression</guid>
                <pubDate>2015-03-12T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>Introducing Bitables</title>
                <description>
&lt;h1 id=&quot;an-introduction-to-bitables-and-the-bitable-library&quot;&gt;An Introduction to Bitables and the Bitable Library&lt;/h1&gt;

&lt;p&gt;Bitables are a storage oriented data structure designed to exploit the benefits of OS optimization to provide a low overhead mechanism for fast range queries and ordered scans on an immutable key-value data-set. The immutability means they can be queried from multiple threads without locking. They’re also designed to be written out fast, using sequential writes, even with large amounts of keys and data. You can think of them as a hybrid between an SSTable and a b+ tree (although, currently they do not allow duplicate keys).&lt;/p&gt;

&lt;p&gt;You can call this a thought experiment, because as I can imagine lots of different use cases for bitables, I have not had time yet to adequately explore them. However, preliminary benchmarks indicate that writing out a bitable is fast enough that they can be used for relatively dynamic structures, not just static ones. Some potential uses would be:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A lucene like inverted index (with segments and merging), when combined with something like &lt;a href=&quot;http://roaringbitmap.org/&quot;&gt;roaring bitmaps&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;A de-amortized log structured COLA like structure (with bitables at deeper levels and the higher levels stored in memory).&lt;/li&gt;
  &lt;li&gt;A static index where range or prefix searches are required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Merging bitables is quite a quick operation, so they are suitable many places large SSTables would be used.&lt;/p&gt;

&lt;p&gt;The basic premise is that bitables are built by adding keys/value pairs in key sorted order (like an SSTable), but they progressively build up a hierarchical index during this process (using very little in the way of extra resources to do so). Note that the library assumes you appending keys in an already sorted order. Writes of the hierarchical index are amortized across many keys and the operating system is left to buffer them up (the index being substantially smaller than the main data) to do as a batch.&lt;/p&gt;

&lt;p&gt;There is a bitable library implementation, written in C (although, the included example is C++). This library serves as a relatively simple reference implementation, although it is designed to be usable for real life use. The library has both posix and win32 implementations, although it has only currently been tested and built on Windows and Linux (ubuntu). I don’t currently claim that the library is production ready, as it hasn’t been used fully in anger yet.&lt;/p&gt;

&lt;p&gt;Here is an example of using the library to search for the lower bound of a range in a bitable, then scan forwards, reading 100 keys and values:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;BitableCursor cursor;
BitableResult searchResult = bitable_find( &amp;amp;cursor, table, &amp;amp;searchKey, BFO_LOWER );

for ( int where = 0; 
      searchResult == BR_SUCCESS &amp;amp;&amp;amp; where &amp;lt; 100; 
      searchResult = bitable_next( &amp;amp;cursor, table ), ++where )  
{
	BitableValue key;
	BitableValue value;

	bitable_key_value_pair( &amp;amp;cursor, &amp;amp;key, &amp;amp;value );

	/* Do something here with the key and value */   
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;how-does-it-work&quot;&gt;How does it work?&lt;/h2&gt;
&lt;p&gt;Bitables consist of multiple levels:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;The leaf level&lt;/em&gt;&lt;/strong&gt;, which is the main ordered store for keys and small values.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;The branch level(s)&lt;/em&gt;&lt;/strong&gt;, which are a hierarchical sorted index into the leaf levels.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;The large value store&lt;/em&gt;&lt;/strong&gt;, which stores values too large to fit in the leaf level, in sorted order.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently each level is stored in a separate file. When building the bitable, each file is only ever appended to (except when we write a final header page on completion), so writes to the individual files are sequential. The operating system is left to actually write these files to disk as it chooses.&lt;/p&gt;

&lt;p&gt;The leaf and branch levels are organised into pages. Within each page, there is a sorted set of keys (and values for leaf pages), which can be searched using a binary search.&lt;/p&gt;

&lt;p&gt;Building the bitable uses an algorithm similar to a bulk insertion into a b+ tree. Keys and small values are added to a leaf page (buffered in memory), as they are appended and when the page is full, the buffer is appended to the file and the next page begun. When a new page is begun, the first key is added to the level above it. New levels are created when the highest current level grows to more than one page.&lt;/p&gt;

&lt;p&gt;Similar to a b+ tree, the first key in each branch level page is implicit and not stored. Unlike a b+ tree, branch level pages do not have a child pointer for every key, but only to the first child page. Because the pages in the level below are in order, we can work out the index to the page based on the result of the binary search.&lt;/p&gt;

&lt;p&gt;Because we don’t have to worry about future inserts or page splitting, every page is as full as possible given the ordering, which should lead to the minimum possible number of levels for the structure (within constraints). This keeps the number of pages needing to be touched for any one query at a minimum, reducing I/O, page faults, TLB misses and increasing the efficiency of the page cache.&lt;/p&gt;

&lt;p&gt;The implementation of bitables uses a trick that many b+ tree implementations use, having offsets to keys (and possibly values) at the front of each page and key/value data at the back. This allows each page to be built up quickly, growing inwards from both the back and the front until it is full. However, it has some disadvantages for processor cache access patterns for searching (sorted order binary searches are not very good for cache access patterns). In future, for search heavy workloads, it might be reasonable to make branch levels use an internal Van Emde Boas layout.&lt;/p&gt;

&lt;h2 id=&quot;the-implementation&quot;&gt;The Implementation&lt;/h2&gt;

&lt;p&gt;The implementation is available &lt;a href=&quot;https://github.com/ConorStokes/bitable&quot;&gt;on GitHub&lt;/a&gt; and the documentation is available &lt;a href=&quot;/bitabledocs&quot;&gt;here&lt;/a&gt;. A premake4 file to create a build is included (and the Windows premake4 binary I used). On Ubuntu, I used the premake4 package (from apt-get). Let me know if there are any issues, or any other platforms you have tried it on.&lt;/p&gt;

&lt;p&gt;The reference implementation relies on the operating system where possible (memory mapped files, the page cache) to do the heavy lifting for things like caching and ordering writes in a smart way. It is a bit naive in that the buffers it uses for writing out bitables are only one page in size (per level), so the number of system calls is probably a higher than it needs to be.&lt;/p&gt;

&lt;p&gt;Reading the bitable uses a zero copy memory mapping system, where keys and values are come from pointers directly into the file (the mapping uses read only page protection, so it shouldn’t be possible to hose the data). Power of 2 alignments are supported for keys and values, specified when initializing the table for creation, so you can cast and access data structures in place. Currently omitting key or value sizes for fixed size keys/values is not supported, but this seems like a good future optimisation for many use cases.&lt;/p&gt;

&lt;p&gt;Apart from initializing and opening the bitable, for read operations a few rules are followed:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;No heap allocation (although, memory may be allocated into the page cache for demand caching by the operating system).&lt;/li&gt;
  &lt;li&gt;Cursors and statistics structures may be allocated on the stack.&lt;/li&gt;
  &lt;li&gt;No locking is required (including internally).&lt;/li&gt;
  &lt;li&gt;No system calls made (memory mapped IO).&lt;/li&gt;
  &lt;li&gt;There is no mutation of the bitable data structure/no reliance on internal shared mutable state.&lt;/li&gt;
  &lt;li&gt;All the code is re-entrant and there is no reliance on statics or global mutable state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the reference library, the bitable write completion process is atomic (the table won’t be readable unless it has been written completely), this is achieved by writing a checksummed header as the last step in the process. It also contains durable and non durable modes for finishing the bitable.  The durable mode completes writes and flushes (including through the on-disk cache) in a particular order to make sure the bitable is completely on storage, the non-durable mode writes in the same order but does not perform the flushing (for use cases where a bitable is only used within the current power cycle).&lt;/p&gt;

&lt;p&gt;The implementation has been designed so that the reading and writing parts of the bitable code are not dependent on each other (although, they are dependent on some small common parts), even though they are currently built into the library together. The library is small enough (it can fit in the instruction cache entirely) that you don’t really need to worry about this in general.&lt;/p&gt;

&lt;p&gt;Platform and portability wise, the implementation also uses UTF-8 for all file paths (including on Windows). The table files produced by the bitable system use platform endianness etc, so they may not be portable between platforms.&lt;/p&gt;

&lt;p&gt;Note that this is a side project for me and has been done in very limited time, so there is plenty of room for improvement, extra work and further rigor to be applied.&lt;/p&gt;

&lt;h2 id=&quot;does-it-actually-perform-decently&quot;&gt;Does it actually perform decently?&lt;/h2&gt;

&lt;p&gt;All these benchmarks were performed on my Windows 8.1 64bit machine with 32GB of RAM, a Core i7 4790 and a Samsung 850 Pro 512GB SSD. All tests use 4KB pages and 8 byte key and value alignment. Note that these benchmarks are definitely not the final say on performance and I haven’t had time to perform adequate bench-marking for multi-threaded reads.&lt;/p&gt;

&lt;p&gt;Our test dataset is using 129,672,136 key value pairs, with 24 byte keys (latitude and longitude as 8 byte doubles, as well as a 64bit unix millisecond time stamp), matching up to an 8 byte value. It’s 3.86 GiB, packed end to end.&lt;/p&gt;

&lt;p&gt;Reading the data set from a warm memory mapped file and creating the bitable takes (averaged over 4 runs) 11.01 seconds in the non-durable mode and 13.08 seconds in the durable mode. The leaf level is 4.84 GiB and the 3 branch levels are 34 MiB, 240 Kib and 4 Kib respectively.&lt;/p&gt;

&lt;p&gt;From this dataset, we then selected keys 2,026,127 keys evenly distributed across the dataset, then randomly sorted them. We then used these for queries point queries (on a single thread), which on a cold read of the bitable averaged 7.51 seconds (averaged over 4 runs again) and on warm runs 1.81 seconds (keys and values were read and verified). That’s well over a million random ordered key point queries per second on a single thread.&lt;/p&gt;
</description>
                <link>http://ConorStokes.github.io/data%20structures/2015/01/01/introducing-bitables</link>
                <guid>http://ConorStokes.github.io/data%20structures/2015/01/01/introducing-bitables</guid>
                <pubDate>2015-01-01T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>A Fun Little Geometric Visibility Thing</title>
                <description>
&lt;p&gt;This is just an interesting little tidbit that I stumbled across a fair few years ago (2006 or so I think) and have been meaning to blog about (I might have and forgotten) ever since. There is a neat trick of geometry that allows you to solve yes-no visibility queries from a point for polygon soups with nothing more than ray-casting and a few tricks of geometry, with no polygon clipping and no sorting.&lt;/p&gt;

&lt;p&gt;I’m not claiming this will actually be useful to anyone, in fact, floating point precision problems make it difficult to do in practice. But, it may come in handy for someone and it may well be practical for drastically simplified versions of a scene.&lt;/p&gt;

&lt;p&gt;Firstly, we’ll talk about visibility queries without any view restrictions (omni-directional from a point). A simple assertion; for non intersecting geometry (intersecting geometry can be handled, with the caveat that the line segments where surfaces intersect must be treated as an edge), a polygon or polygonal object is visible if a ray from the query point passing through 2 edges on the silhouette of any object in the scene hits the object without being occluded.&lt;/p&gt;

&lt;p&gt;If you are familiar with the rule for visibility queries between polygons; that there must exist an extremal stabbing line going through 4 edges between 2 polygons for them to be visible to each other, this is a natural extension to that, because the constraint of the point in the query (the eye, the camera, or whatever you want to call it) is the equivalent to the constraint of 2 edges. So we are left with the point and 2 edges to define an extremal stabbing line; of which one must exist for the visibility query to return a positive result.&lt;/p&gt;

&lt;p&gt;Now, there is the case of determining what edges, in particular, will provide us with a ray to cast and what the ray will be. Luckily, there is a straight forward answer to this:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;They must be on the silhouette of an object and if the object is a polygon connected to other polygons, this includes the edges of the polygon in the query.&lt;/li&gt;
  &lt;li&gt;For such a ray to exist for 2 edges and point, each edge must straddle the plane through the other edge and the query point.&lt;/li&gt;
  &lt;li&gt;The ray going through these 2 edges is the intersection of these planes; so it must be perpendicular to both planes. This means the direction of the ray is the cross product of the normals of the planes going through each edge and the query point.&lt;/li&gt;
  &lt;li&gt;The origin of the ray is obviously the query point.&lt;/li&gt;
  &lt;li&gt;This ray must obviously intersect with the query object too (if one or more of the edges is on the query object, this is a given).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is of course a special case to this; 2 edges often intersect at a vertex, in which case there will exist a ray going through the query point and the vertex.&lt;/p&gt;

&lt;p&gt;Anyway, to solve the query, you enumerate all the query point silhouette edge-edge cases and see if you find one that hits the query object without being occluded by another object. If such a ray exists, then the object is visible. You could do a whole scene at once by enumerating all the query point edge-edge cases and knowing that only the objects that got hit were visible.&lt;/p&gt;

&lt;p&gt;You could, potentially, do something similar to a beam-tree to accelerate finding which edges straddled the planes of other edges. If I were to make a terrible pun, I would say this is a corner case of a beam-tree (in that, the rays in question are essentially the corners of significant plane intersections in the beam-tree).&lt;/p&gt;

&lt;p&gt;This also works in reverse for the view frustum and portal cases; in this case the ray through the query point and edges must pass through the portals and the view frustum. This allows you to perform portal queries without clipping the portals.&lt;/p&gt;

&lt;p&gt;There is also, I suspect, a fair bit of temporal coherence for the edges involved in a visibility query; if the query point moves only slightly, it is likely the same edges will produce an extermal stabbing line that proves visibility.&lt;/p&gt;
</description>
                <link>http://ConorStokes.github.io/geometry/2014/10/15/a-fun-little-geometric-visibility-thing</link>
                <guid>http://ConorStokes.github.io/geometry/2014/10/15/a-fun-little-geometric-visibility-thing</guid>
                <pubDate>2014-10-15T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>Better Vertex Cache Optimised Index Buffer Compression</title>
                <description>
&lt;p&gt;I’ve had a second pass at the compression/decompression algorithm now, after some discussion with davean on #flipCode. The new iteration of the algorithm (which is available alongside the original) is a fair bit faster for decompression, slightly faster for compression and has a slightly better compression ratio. The updated algorithm doesn’t however support degenerate triangles (triangles that have a duplicate vertex indice), where as the original does.&lt;/p&gt;

&lt;p&gt;The original is discussed &lt;a href=&quot;http://conorstokes.github.io/graphics/2014/09/28/vertex-cache-optimised-index-buffer-compression/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The main change to the algorithm is to change from per vertex codes to a single composite triangle code. Currently for edge FIFO hits there are two 2 bits codes and for other cases, three 2 bit codes. There are a lot of redundant codes here, because not all combinations are valid and some code combinations are rotations of each other. The new algorithm rotates the vertex order of triangles to reduce the number of codes, which lead to one 4 bit code per triangle. This nets us a performance improvement and a mild compression gain.&lt;/p&gt;

&lt;p&gt;There were also some left over codes, so I added a special encoding that took the edge + new vertex triangle case and special cased it for the 0th and 1st edges in the FIFOs. This could potentially net very big wins if you restrict your ordering to always use a triangle adjacent to the last one, trading vertex cache optimisation for compression.&lt;/p&gt;

&lt;p&gt;Here’s the performance of the old algorithm:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;MODEL  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  TRIANGLES  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  UNCOMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  COMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  COMPRESSION TIME  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  DECOMPRESSION TIME&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bunny&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  69,630&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  835,560&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  111,786&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  3.7ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1.45ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Armadillo&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  345,944&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  4,151,328&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  563,122&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  17ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  6.5ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Dragon&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  871,306&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  10,455,672&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,410,502&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  44.8ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  16.6ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Buddha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,087,474&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  13,049,688&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,764,509&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  54ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  20.8ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;And here is the performance of the new one:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;MODEL  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  TRIANGLES  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  UNCOMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  COMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  COMPRESSION TIME  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  DECOMPRESSION TIME&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bunny&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  69,630&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  835,560&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  108,908&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  2.85ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  0.92ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Armadillo&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  345,944&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  4,151,328&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  547,781&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  15.9s&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  4.6ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Dragon&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  871,306&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  10,455,672&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,363,265&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  36.3ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  11.8ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Buddha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,087,474&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  13,049,688&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,703,928&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  46ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  14.7ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Overall, there seems to be a 30%-40% speedup on decompression and a modest 3% improvement on compression.&lt;/p&gt;

&lt;p&gt;Also, I’d like to thank Branimir Karadžić, whose changes I back-ported, which should hopefully add support for 16bit indices and MSVC 2008 (unless I’ve broken them with my changes - I don’t have MSVC 2008 installed to test).&lt;/p&gt;

&lt;p&gt;If you haven’t checked out the source, it’s available on &lt;a href=&quot;https://github.com/ConorStokes/IndexBufferCompression&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
</description>
                <link>http://ConorStokes.github.io/graphics/2014/09/30/better-vertex-cache-optimised-index-buffer-compression</link>
                <guid>http://ConorStokes.github.io/graphics/2014/09/30/better-vertex-cache-optimised-index-buffer-compression</guid>
                <pubDate>2014-09-30T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>Vertex Cache Optimised Index Buffer Compression</title>
                <description>
&lt;p&gt;&lt;em&gt;Update&lt;/em&gt; - There is a &lt;a href=&quot;http://conorstokes.github.io/graphics/2014/09/30/better-vertex-cache-optimised-index-buffer-compression/&quot;&gt;new post&lt;/a&gt; about an updated version of the algorithm listed here.&lt;/p&gt;

&lt;p&gt;A few weeks ago, I saw Fabian Giesen’s &lt;a href=&quot;http://fgiesen.wordpress.com/2013/12/14/simple-lossless-index-buffer-compression/&quot;&gt;Simple lossless(*) index buffer compression&lt;/a&gt; post (and the accompanying code on GitHub) and it made me think about a topic I haven’t thought about in a while, index buffer compression. A long time ago, at university, I built a mesh compressor as a project. It had compression rates for triangle lists of less than 2bits a triangle (and did pretty well with vertices too), but it had a few limitations; it completely re-ordered the triangles and it required that at most 2 triangles share an edge. The performance was semi-decent, but it was also relatively heavy and complicated, as well as requiring a fair bit of dynamic allocation for maintaining things like connectivity structures and an edge stack.&lt;/p&gt;

&lt;p&gt;Re-ordering the triangles has the disadvantage that it destroys post-transform vertex cache optimisation (although, it did optimise order for the pre-transform vertex cache). Now, the vertex cache utilisation of these algorithms isn’t generally catastrophic, as they use locality, but definitely worse than those produced by &lt;a href=&quot;http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html&quot;&gt;Tom Forsyth’s algorithm&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Fabian’s algorithm has the advantage of keeping triangle order, while performing better when vertex cache optimisation has been performed. It’s also incredibly simple, easy to implement and uses very little in the way of extra resources. The key insight is that triangles that have been vertex cache optimised are likely to share an edge with the previous triangle.&lt;/p&gt;

&lt;p&gt;But what if we extend this assumption a little, in that a triangle is also likely to share edges and vertices with other recent triangles. This is pretty obvious as this is exactly what the vertex cache optimisation aims for when it re-orders the triangles.&lt;/p&gt;

&lt;h2 id=&quot;the-algorithm&quot;&gt;The Algorithm&lt;/h2&gt;
&lt;p&gt;Post-transform vertex caches in hardware are typically implemented as fixed size FIFOs. Given that is a case we’ve already optimized for (and fixed sized ring-buffer FIFOs are very cheap to implement), this is the concept we’ll use as the basis for our algorithm. As well as a vertex index FIFO cache, we’ll also introduce an edge FIFO cache that has the most recent edges.&lt;/p&gt;

&lt;p&gt;What about cache misses? Well, these fall into two categories; new vertices that haven’t yet been seen in the triangle list and cache misses for repeated vertices. If we re-order vertices so that they are sorted in the order they appear in the triangle list, then we can encode them with a static code and use an internal counter to keep track of the index of these vertices.&lt;/p&gt;

&lt;p&gt;Cache misses are obviously the worst case for the algorithm and we encode these relative to the last seen new vertex, with a v-int encoding.&lt;/p&gt;

&lt;p&gt;So, we end up with four codes (which, for a fixed code size, means 2 bits):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;New vertex&lt;/em&gt;&lt;/strong&gt;, a vertex we haven’t seen before.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;Cached edge&lt;/em&gt;&lt;/strong&gt;, edges that have been seen recently and are in the FIFO. This is followed by a relative index back into the edge FIFO (using a small fixed bit with; 5bits for a 32 entry FIFO).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;Cached vertex&lt;/em&gt;&lt;/strong&gt;, vertices that been seen recently and are in the FIFO. This is followed by a relative index back into the vertex FIFO (same fixed bit with and FIFO size as the cached edge FIFO).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&lt;em&gt;Free vertex&lt;/em&gt;&lt;/strong&gt;, for vertices that have been seen but not recently. This code is followed by a variable length integer encoding (like that seen in protobuf) of the index relative to the most recent new vertex.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Triangles can either consist of two codes, a cached edge followed by one of the vertex codes, or of 3 of the vertex codes. The most common codes in an optimised mesh are generally the cached edge and new vertex codes.&lt;/p&gt;

&lt;p&gt;Cached edges are always the first code in any triangle they appear in and may correspond to any edge in the original triangle (we check all the edges against the FIFO). This means that an individual triangle may have its vertices specified in a different order (but in the same winding direction) than the original uncompressed one. It also simplifies the implementation in the decompression.&lt;/p&gt;

&lt;p&gt;While we use a quite simple encoding, with lots of fixed widths, the algorithm has also been designed such that an entropy encoder could be used to improve the compression.&lt;/p&gt;

&lt;p&gt;With the edge FIFO, for performance on decompression, we don’t check an edge is already in the FIFO before inserting it, but we don’t insert an edge in the case that we encounter a cached edge code. This is the same for cached vertices. This means the decompression algorithm does not have to probe the FIFOs.&lt;/p&gt;

&lt;h2 id=&quot;results&quot;&gt;Results&lt;/h2&gt;

&lt;p&gt;I’ve provided a simple proof of concept implementation on &lt;a href=&quot;https://github.com/ConorStokes/IndexBufferCompression&quot;&gt;GitHub&lt;/a&gt;. These results were obtained with a small test harness and this implementation, using Visual Studio 2013 and on my system (with a bog standard i7 4790 processor).&lt;/p&gt;

&lt;p&gt;To make things consistent, I decided to make my results relative to those provided in Fabian’s blog, using the same Armadillo mesh. His results use a file that encodes both the positions of the vertices and the indices in a simple binary.&lt;/p&gt;

&lt;p&gt;The Armadillo mesh has 345,944 triangles, which is 4,151,328 bytes of index information. After running a vertex cache optimisation (using Tom Forsyth’s algorithm) and then compressing with my algorithm, the index information takes up 563,122 bytes, or about 13 bits a triangle. By comparison, just running 7zip on &lt;em&gt;just&lt;/em&gt; the optimised indices comes in at 906,575 bytes (so, it quite handily beats much slower standard dictionary compression). Compression takes 17 milliseconds and decompression takes 6.5 milliseconds, averaged over 8 runs. Even without the vertex cache optimisation, the algorithm still compresses the mesh (but not well), coming in at 1,948,947 bytes for the index information.&lt;/p&gt;

&lt;p&gt;For comparison to Fabian’s results and using the same method as him, storing the uncompressed vertices (ZIP and 7z results done with 7-zip):&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;STAGE&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  SIZE  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  .ZIP SIZE  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  .7Z SIZE&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Compression (Vertex Optimised)&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  2577k&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1518k&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1276k&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Performance wise, the algorithm offers linear scaling, decompressing about 50 million triangles a second and compressing about 20 million across a variety of meshes with my implementation on a single core. For compression, I used a large pre-allocated buffer for the bitstream to avoid the overhead of re-allocations. Compression is also very consistently between 12 and 13bits a triangle.&lt;/p&gt;

&lt;p&gt;The compressed and uncompressed columns in the below table refer to sizes in bytes. The models are the typical Stanford scanned test models.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;MODEL  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  TRIANGLES  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  UNCOMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  COMPRESSED  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  COMPRESSION TIME  &lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;  DECOMPRESSION TIME&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Bunny&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  69,630&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  835,560&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  111,786&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  3.7ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1.45ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Armadillo&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  345,944&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  4,151,328&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  563,122&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  17ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  6.5ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Dragon&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  871,306&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  10,455,672&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,410,502&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  44.8ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  16.6ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;Buddha&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,087,474&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  13,049,688&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  1,764,509&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  54ms&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;  20.8ms&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt; &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;notes-about-the-implementation&quot;&gt;Notes About the Implementation&lt;/h2&gt;

&lt;p&gt;Firstly, the implementation is in C++ (but it wouldn’t be too hard to move it to straight C, if that is your thing). However, I’ve eschewed dependencies where-ever possible, including the STL and tried to avoid heap allocation as much as possible (only the bitstream allocates if it needs to grow the buffer). I’ve currently only compiled the implementation on MSVC, although I have tried to keep other compilers in mind. If you compile somewhere and it doesn’t work, let me know and I’ll patch it.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/ConorStokes/IndexBufferCompression&quot;&gt;implementation&lt;/a&gt; provides a function that compresses the indices (CompressIndexBuffer) and one that decompresses the indices (DecompressIndexBuffer), located in IndexBufferCompression.cpp/IndexBufferCompression.h and IndexBufferDecompression.cpp/IndexBufferDecompression.h. There’s also some shared constants (nothing else is shared between them) and some very simple read and write bitstream implementations. While this is a proof of concept implementation, it’s designed such that you can just drop the relevant parts (compression or decompression) into your project without bringing in anything else. Compression doesn’t force the flushing of the write stream, so make sure you call WriteBitstream::Finish to flush the stream after compressing, or the last few triangles might be incorrect.&lt;/p&gt;

&lt;p&gt;There has been little optimisation work apart from adding some force-inlines due to compiler mischief, so there is probably some room for more speed here.&lt;/p&gt;

&lt;p&gt;I’ve allocated the edge and vertex FIFOs on the stack and made the compression and decompression functions work on whole mesh at a time. It’s possible to implement the decompression to be lazy, decompressing a single (or batch) of triangles at a time. Doing this, you could decompress in-place, as you walked across the mesh. I’m not sure or not if the performance is there for you to do this in real-time and that probably varies on your use case.&lt;/p&gt;
</description>
                <link>http://ConorStokes.github.io/graphics/2014/09/28/vertex-cache-optimised-index-buffer-compression</link>
                <guid>http://ConorStokes.github.io/graphics/2014/09/28/vertex-cache-optimised-index-buffer-compression</guid>
                <pubDate>2014-09-28T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>C++ has no home</title>
                <description>
&lt;p&gt;On reviewing the new C++ standard, C++14, I’ve come to the conclusion that modern C++ has no home. C and a very limited subset of C++ (colloquially known as C+, which hasn’t seen many improvements since C++98), are at home as systems languages, because very few languages offer the capability to work with constructs that are known to be exculpated from unpredictable performance overhead. They also offer the ability to play with memory in a very raw but controlled way, which can be very useful for systems languages. There are a plethora of higher level languages, run-times and frameworks which are far better at being application languages (both server and client side) than C++ and offer good enough performance, better semantics, far superior standard libraries and far greater productivity than modern C++.&lt;/p&gt;

&lt;p&gt;On top of this, C++ has continued to become more complicated (C++98 was already a complicated and semantically obtuse beast) and even as someone who has been working with the language for over 15 years, it can be non-trivial to understand what someone using some of the newer features is trying to achieve. Beyond that, someone trying to make the features of C++ work precludes features being added that actually add something to the language (type safe discriminated unions and de-structuring!). Compile times somehow manage to get worse with each iteration of the language and compiler error messages when something goes wrong with modern C++ mechanisms are notoriously hard to understand. To top this off, the non-trivial semantics make it hard to reason about the performance implication of code when that is the only reason left to use C++ over other languages that offer higher level features.&lt;/p&gt;

&lt;p&gt;A large part of the reason for this is the persistence with using textual replacement as the main means to achieve anything in C++. This is the hangover from C, where header files, clumsy separable compilation and the preprocessor were king. The entire problem with templates and C++ compile times in general comes from this mechanism, where instead of relying on sensible and well-defined compiler semantics that transform code into well-defined types that the compiler can hold easily in memory between compilation units (where the compiler only needs to know the symbols and types match, outside of optimisation), templates are essentially an expanded blob of text with some symbols replaced and they have to be expanded (with checks) for every separate compilation unit (sometimes several times), where the semantics might be different each time. In fact, every type and function known to the compiler has to be fully expanded and parsed (with possibly changing semantics) for every compilation unit. Is there a greater sign that this mechanism is broken than the pimpl concept?&lt;/p&gt;

&lt;p&gt;Now, in some circles, what I’m going to say is blasphemy, but, really it is time for language mechanisms based on textual replacement to have a pillow put over their collective faces and for the rest of us to throw a drinking fountain through the window and escape. It’s the reason we can’t have nice things. Other languages manage to provide generic typing and meta-programming mechanisms without mile long compiler messages or one hour compile times (yes, even with types that have different sizes and don’t require boxing). I often see C++ programmers complaining about C++ language features as if the concepts (like generic typing, lambdas/closures and meta-programming) are themselves bad, when it is not the concept, but the C++ implementation that is so horrible.&lt;/p&gt;

&lt;p&gt;As an aside, exceptions are also implemented poorly in C++, but for other reasons. In the exception holy war, people tend to pick a side based on whether performance or robustness is the primary goal and C++ can get away with a poor exception handling mechanism because many of the people that use it are on the performance side of the fence and avoid exception handling anyway.&lt;/p&gt;

&lt;p&gt;Yes, we have been promised a module system, but I don’t really think it will ever be enough, because the language already brings too much baggage. I think it has actually reached the stage where we need a new language in this space, that offers what C+ and C offer (apart from textual replacement and the clumsy separable compilation mechanism), while bringing in far more sensible versions of the features C++ is trying to provide.&lt;/p&gt;

</description>
                <link>http://ConorStokes.github.io/programming/2014/08/23/c-has-no-home</link>
                <guid>http://ConorStokes.github.io/programming/2014/08/23/c-has-no-home</guid>
                <pubDate>2014-08-23T00:00:00+00:00</pubDate>
        </item>

        <item>
                <title>Return of the Quack</title>
                <description>
&lt;p&gt;I’m attempting a return to regular writing a regular blog, because I need somewhere to get ideas down and doing it in a way where you can’t be ridiculed in public is just boring.&lt;/p&gt;
</description>
                <link>http://ConorStokes.github.io/introduction/2014/08/02/return-of-the-quack</link>
                <guid>http://ConorStokes.github.io/introduction/2014/08/02/return-of-the-quack</guid>
                <pubDate>2014-08-02T00:00:00+00:00</pubDate>
        </item>


</channel>
</rss>
