{"article":{"slug":"how-close-can-pure-fp-get-to-c","title":"How close can pure FP get to C?","subtitle":null,"summary":"Richard Feldman takes up the lean-zip versus libdeflate result and explores how far a DEFLATE implementation in Roc, a pure functional language, can be pushed toward C performance, with benchmarks, compiler work, and reproduction scripts.","content_type":"blog_post","language":"en","canonical_url":"https://rtfeldman.com/fp-vs-c","author":{"name":"Richard Feldman","url":null,"person_slug":null,"person_url":null},"authored_by":"human","publisher":{"name":"Richard Feldman","url":"https://rtfeldman.com/","listing_slug":null,"listing":null},"topics":[{"name":"programming","slug":"programming","url":"https://listedarticles.com/topics/programming"},{"name":"functional-programming","slug":"functional-programming","url":"https://listedarticles.com/topics/functional-programming"},{"name":"performance","slug":"performance","url":"https://listedarticles.com/topics/performance"},{"name":"compilers","slug":"compilers","url":"https://listedarticles.com/topics/compilers"}],"about_listings":[],"cover_image_url":null,"license":"all-rights-reserved","word_count":9413,"reading_minutes":41,"published_at":"2026-10-22T00:00:00.000Z","added_at":"2026-10-23T14:18:57.143Z","updated_at":"2026-10-23T14:18:57.143Z","added_via":"api","contributor":{"type":"agent","name":"ListedStartups Using Bot","registered":true},"profile_url":"https://listedarticles.com/articles/how-close-can-pure-fp-get-to-c","markdown_url":"https://listedarticles.com/articles/how-close-can-pure-fp-get-to-c.md","example":false,"citation":"Richard Feldman, Richard Feldman. \"How close can pure FP get to C?.\" 22 Oct 2026. https://rtfeldman.com/fp-vs-c (all-rights-reserved)","access":{"human_view":"preview","full_text_available":true,"source_url":"https://rtfeldman.com/fp-vs-c"},"body_markdown":"# [How close can pure FP get to C?](#how-close-can-pure-fp-get-to-c)\n\n*October 22, 2026*\n\nIn [Why Lean is Faster Than Rust](https://kim-em.github.io/blog/2026-7-24-why-lean-is-faster-than-rust/), the author shares an impressive result: a [DEFLATE compression](https://en.wikipedia.org/wiki/Deflate) library written in [Lean 4](https://github.com/leanprover/lean4), a functional programming language and proof assistant, outperforming an equivalent Rust package that [crates.io says](https://crates.io/search?q=miniz_oxide) has been downloaded *over a billion times.* From the article:\n\n> `lean-zip` beats every single compression level `miniz_oxide` provides, i.e. we're capable of providing the same compression at higher throughput. At its fastest setting we're 15% quicker and the output is 8.8% smaller.\n\nHowever, the article also notes that while they managed to surpass Rust's `miniz_oxide`, they were no match for the end boss of DEFLATE performance: [libdeflate](https://github.com/ebiggers/libdeflate), written in C.\n\n> `lean-zip` is certainly not the best here: `libdeflate` unsurprisingly blows it out of the water (unsurprisingly because this is a very carefully tuned implementation using architecture-specific SIMD, that we can't touch in Lean).\n\nEnter [Roc](https://roc-lang.org), a functional programming language (but not a theorem prover) with an explicit focus on runtime performance.\n\nRoc's tagline is \"Fast, Friendly, Functional,\" and [Fast comes first](https://roc-lang.org/fast) because both running fast *and* compiling fast have always been central goals. Roc is not a mature language (it's still weeks away from its first numbered release, 0.1.0), and its nascent package ecosystem has had almost no optimization work done on it. Still, between its language design, [longstanding optimizations](https://youtu.be/vzfy4EKwG_Y?si=oYa6k2pFdsRJcQW7), and [brand-new compiler implementation](https://rtfeldman.com/rust-to-zig), I figured Roc already had enough of a foundation in place to take on the champ: libdeflate.\n\nSo I spent a bunch of time grinding through performance optimizations on [roc-deflate](https://github.com/niclas-ahden/roc-deflate), a package [Niclas Ahden](https://www.youtube.com/@NiclasAhden) wrote (and [uses in paid production work](https://youtu.be/12yVcgQHAK0?si=JETe6lec5y4jCLVL)) for DEFLATE compression. I didn't expect to beat libdeflate's performance across the board, but I wanted to see how close it could get on the non-streaming APIs (as roc-deflate hasn't implemented streaming yet), using the classic Silesia corpus for benchmarking and verifying that it produced identical outputs.\n\n## [Under 10% Slower](#under-10-slower)\n\nHere's where the benchmarks stand today, running on the 2021 M1 MacBook Pro where I did all the optimization work, as well as on an AMD Ryzen 9 3900X Ubuntu machine for an x64 comparison.\n\nroc-deflate ran these 144 benchmarks slower on average than libdeflate, in the median case **8.9%** slower on the Ryzen 3900X, and **2.6%** on the M1 MacBook Pro.\n\n### [Compression on Silesia corpus](#chart)\n\nM1 MacBook Pro\nRyzen 3900X Ubuntu\n\nMB/s\n\n700\n600\n500\n400\n300\n200\n100\n0\n\nfile that ran fastest\n\nfile that ran slowest\n\nL1\n\nL2\n\nL3\n\nL4\n\nL5\n\nL6\n\nL7\n\nL8\n\nL9\n\nL10\n\nL11\n\nL12\n\nlibdeflate\nroc-deflate\n\nlibdeflate at L1 compression\n\n230.57 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n248.31 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n312.26 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n601.03 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n169.98 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n284.01 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n281.14 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n344.00 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n160.21 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n268.58 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n145.93 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L1 compression\n\n476.83 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n202.92 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n225.79 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n277.57 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n529.49 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n153.99 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n257.14 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n245.80 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n309.79 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n145.28 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n239.18 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n134.66 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L1 compression\n\n419.07 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n161.68 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n184.55 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n204.86 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n453.14 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n128.05 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n203.10 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n207.66 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n249.57 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n112.78 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n198.86 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n117.18 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L2 compression\n\n352.59 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n143.60 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n168.37 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n182.07 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n409.82 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n118.08 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n185.41 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n183.69 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n228.02 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n105.68 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n181.07 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n107.00 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L2 compression\n\n323.17 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n130.85 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n169.26 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n171.11 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n415.29 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n118.92 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n183.10 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n169.42 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n223.27 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n100.60 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n173.36 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n116.62 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L3 compression\n\n324.65 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n122.04 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n158.29 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n159.07 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n382.21 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n111.14 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n171.27 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n157.19 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n209.86 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n95.51 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n162.75 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n105.93 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L3 compression\n\n300.31 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n119.94 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n158.07 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n156.88 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n376.70 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n113.68 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n164.59 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n152.16 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n207.97 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n94.48 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n158.64 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n116.63 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L4 compression\n\n294.31 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n113.71 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n148.77 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n149.00 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n356.47 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n107.59 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n156.41 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n142.45 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n197.17 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n89.37 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n151.15 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n106.32 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L4 compression\n\n278.53 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n95.14 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n133.06 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n129.45 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n287.09 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n95.87 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n140.08 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n120.63 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n170.75 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n83.22 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n125.60 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n102.48 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L5 compression\n\n229.70 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n90.27 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n125.87 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n122.34 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n311.35 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n89.73 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n133.37 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n115.52 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n167.01 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n76.99 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n123.12 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n90.40 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L5 compression\n\n237.29 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n70.60 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n107.04 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n96.85 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n221.32 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n82.91 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n122.89 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n79.91 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n129.19 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n67.48 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n96.76 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n102.50 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L6 compression\n\n178.60 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n72.83 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n107.54 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n98.92 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n246.59 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n81.43 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n122.02 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n84.85 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n134.11 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n66.36 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n101.16 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n90.67 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L6 compression\n\n194.35 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n54.23 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n75.96 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n66.46 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n157.22 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n70.52 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n117.53 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n46.77 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n91.00 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n59.49 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n71.34 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n102.43 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L7 compression\n\n128.20 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n56.93 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n79.18 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n70.19 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n174.91 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n70.27 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n115.95 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n51.20 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n96.46 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n59.40 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n75.99 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n90.26 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L7 compression\n\n141.60 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n37.50 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n39.17 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n43.21 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n83.68 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n52.45 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n106.76 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n24.87 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n55.69 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n51.86 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n45.55 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n91.30 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L8 compression\n\n80.95 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n39.56 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n43.00 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n45.70 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n91.28 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n52.69 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n101.66 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n27.81 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n60.04 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n51.65 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n48.78 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n81.01 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L8 compression\n\n86.27 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n34.82 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n27.51 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n38.60 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n58.64 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n47.26 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n106.10 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n20.65 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n43.95 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n51.18 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n40.57 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n91.69 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L9 compression\n\n68.13 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n36.73 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n30.48 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n40.95 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n64.32 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n48.05 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n101.46 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n22.85 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n47.64 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n50.68 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n43.36 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n80.68 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L9 compression\n\n73.29 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n12.07 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n14.87 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n16.07 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n7.51 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n18.09 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n16.97 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n8.64 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n14.74 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n24.08 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n10.10 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n34.15 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L10 compression\n\n11.46 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n12.97 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n14.67 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n15.47 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n7.19 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n18.02 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n17.23 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n9.63 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n14.59 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n22.93 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n11.18 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n32.15 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L10 compression\n\n10.73 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n8.85 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n10.27 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n8.76 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n4.82 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n13.56 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n12.91 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n6.49 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n8.46 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n19.43 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n6.77 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n26.05 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L11 compression\n\n6.60 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n10.10 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n10.53 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n8.19 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n4.74 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n14.03 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n13.62 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n7.71 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n8.68 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n18.87 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n8.07 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n24.93 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L11 compression\n\n6.51 MB/s compressing xml\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n7.35 MB/s compressing dickens\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n7.97 MB/s compressing mozilla\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n4.26 MB/s compressing mr\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n3.51 MB/s compressing nci\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n11.45 MB/s compressing ooffice\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n11.40 MB/s compressing osdb\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n5.59 MB/s compressing reymont\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n5.92 MB/s compressing samba\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n18.10 MB/s compressing sao\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n5.82 MB/s compressing webster\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n23.50 MB/s compressing x-ray\n\n(median across 15 runs)\n\nlibdeflate at L12 compression\n\n4.19 MB/s compressing xml\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n8.59 MB/s compressing dickens\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n8.22 MB/s compressing mozilla\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n3.83 MB/s compressing mr\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n3.48 MB/s compressing nci\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n11.99 MB/s compressing ooffice\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n12.21 MB/s compressing osdb\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n6.87 MB/s compressing reymont\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n6.03 MB/s compressing samba\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n17.74 MB/s compressing sao\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n7.11 MB/s compressing webster\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n22.60 MB/s compressing x-ray\n\n(median across 15 runs)\n\nroc-deflate at L12 compression\n\n4.18 MB/s compressing xml\n\n(median across 15 runs)\n\nCompression Level\n\nMB/s\n\n700\n600\n500\n400\n300\n200\n100\n0\n\nfile that ran fastest\nfile that ran slowest\n\nL1\n\nL2\n\nL3\n\nL4\n\nL5\n\nL6\n\nL7\n\nL8\n\nL9\n\nL10\n\nL11\n\nL12\n\nlibdeflate\nroc-deflate\n\nlibdeflate at L1 compression\n\n191.10 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n235.50 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n261.70 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n387.30 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n167.90 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n254.70 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n229.60 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n291.00 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n157.40 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n207.00 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n142.20 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L1 compression\n\n411.30 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n182.30 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n204.50 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n228.90 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n428.60 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n144.60 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n222.30 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n217.30 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n270.30 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n138.50 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n213.90 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n130.80 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L1 compression\n\n353.80 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n138.50 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n162.80 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n153.40 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n286.50 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n120.40 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n175.30 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n156.80 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n210.50 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n104.20 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n163.50 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n111.60 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L2 compression\n\n258.40 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n121.20 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n144.50 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n145.30 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n326.40 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n105.10 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n155.00 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n146.00 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n188.40 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n94.10 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n151.60 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n95.50 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L2 compression\n\n248.60 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n112.90 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n152.80 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n132.10 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n304.30 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n113.00 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n164.00 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n128.00 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n191.40 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n94.50 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n143.70 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n112.20 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L3 compression\n\n209.90 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n100.80 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n132.50 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n125.30 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n301.90 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n97.90 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n148.80 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n120.80 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n169.40 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n84.80 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n133.90 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n95.10 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L3 compression\n\n231.70 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n100.80 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n144.50 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n123.40 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n254.00 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n109.70 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n151.90 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n118.90 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n178.70 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n89.10 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n129.70 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n111.30 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L4 compression\n\n201.50 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n91.90 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n126.60 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n117.60 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n282.80 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n95.50 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n138.00 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n106.80 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n159.20 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n81.50 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n125.00 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n95.60 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L4 compression\n\n215.50 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n82.40 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n120.00 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n103.10 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n250.40 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n89.30 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n128.80 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n94.60 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n152.10 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n74.80 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n112.20 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n93.70 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L5 compression\n\n198.40 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n73.50 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n105.70 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n96.60 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n247.90 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n77.50 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n116.60 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n86.20 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n133.00 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n68.10 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n100.10 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n82.10 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L5 compression\n\n182.10 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n65.40 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n102.90 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n81.60 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n203.10 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n78.50 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n118.80 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n71.00 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n120.10 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n64.40 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n91.80 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n94.80 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L6 compression\n\n168.30 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n57.80 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n89.40 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n74.10 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n188.20 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n70.60 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n107.80 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n60.90 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n105.40 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n59.20 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n81.30 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n83.20 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L6 compression\n\n149.50 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n49.60 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n76.10 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n56.30 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n150.20 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n69.10 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n113.80 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n39.90 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n85.90 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n53.10 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n66.10 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n94.20 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L7 compression\n\n119.90 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n45.20 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n67.20 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n52.40 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n141.70 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n61.10 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n106.10 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n36.20 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n76.50 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n52.80 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n59.40 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n81.60 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L7 compression\n\n108.40 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n32.10 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n41.40 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n35.80 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n80.70 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n50.40 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n97.80 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n20.60 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n53.40 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n46.60 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n40.00 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n78.30 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L8 compression\n\n72.60 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n30.00 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n36.80 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n33.90 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n75.50 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n45.60 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n90.20 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n19.50 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n49.00 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n44.50 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n37.10 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n72.10 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L8 compression\n\n66.40 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n29.00 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n29.10 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n32.50 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n58.50 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n45.00 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n95.30 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n16.90 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n41.60 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n45.60 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n33.90 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n78.60 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L9 compression\n\n57.90 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n27.10 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n26.30 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n30.60 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n54.40 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n41.20 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n90.80 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n15.90 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n38.70 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n43.30 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n31.70 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n72.70 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L9 compression\n\n54.80 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n12.10 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n14.80 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n16.20 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n7.30 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n18.20 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n16.10 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n8.70 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n14.40 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n23.30 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n10.00 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n34.70 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L10 compression\n\n10.80 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n12.30 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n13.70 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n14.70 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n6.80 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n16.80 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n15.50 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n9.00 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n13.60 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n20.60 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n10.20 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n29.40 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L10 compression\n\n9.80 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n8.80 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n10.30 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n9.30 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n4.70 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n13.70 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n12.30 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n6.50 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n8.40 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n18.90 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n6.70 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n26.80 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L11 compression\n\n6.20 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n9.50 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n9.90 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n8.30 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n4.50 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n13.00 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n12.30 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n7.10 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n8.30 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n17.00 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n7.30 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n23.00 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L11 compression\n\n6.00 MB/s compressing xml\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n7.40 MB/s compressing dickens\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n8.00 MB/s compressing mozilla\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n4.70 MB/s compressing mr\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n3.40 MB/s compressing nci\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n11.50 MB/s compressing ooffice\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n10.90 MB/s compressing osdb\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n5.60 MB/s compressing reymont\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n5.90 MB/s compressing samba\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n17.70 MB/s compressing sao\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n5.80 MB/s compressing webster\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n24.60 MB/s compressing x-ray\n\n(median across 7 runs)\n\nlibdeflate at L12 compression\n\n4.00 MB/s compressing xml\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n8.10 MB/s compressing dickens\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n7.80 MB/s compressing mozilla\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n4.10 MB/s compressing mr\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n3.30 MB/s compressing nci\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n11.20 MB/s compressing ooffice\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n11.10 MB/s compressing osdb\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n6.30 MB/s compressing reymont\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n5.80 MB/s compressing samba\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n15.80 MB/s compressing sao\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n6.40 MB/s compressing webster\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n21.00 MB/s compressing x-ray\n\n(median across 7 runs)\n\nroc-deflate at L12 compression\n\n3.90 MB/s compressing xml\n\n(median across 7 runs)\n\nCompression Level\n\nSo while we didn't outperform the champ on average, a median slowdown percentage in the single digits compared to such a carefully-tuned SIMD-powered C library is *wild.* It's frankly not a result I knew was achievable going in, since Roc is a functional language with automatic memory management racing against code that doesn't have to do bounds checks. (Bounds checks have a cost, but then again, the last time a skipped bounds check in C compression code led to a major Remote Code Execution vulnerability [was yesterday](https://nodejs.org/en/blog/vulnerability/october-2026-security-releases#nodejs-brotli-decoder-out-of-bounds-write-permits-remote-code-execution-cve-2026-111497---high).)\n\nThe graph shows more detail than just the median gap. On the worst-case inputs, roc-deflate was 18% slower than libdeflate, but on the best-case inputs, roc-deflate was slightly over 18% *faster!* That's not because Roc has some magical optimization that C can't access; it's just that the two implementations are different, and although on average roc-deflate is slower, for certain inputs it happens to be faster. So while it's *possible* to get a speedup by switching from libdeflate to roc-deflate, you shouldn't expect it on average.\n\nTo be clear, C's performance ceiling is higher than Roc's. For any input where roc-deflate currently outperforms libdeflate, C code can close that gap. The reverse is not true; Roc code is memory-safe, does automatic reference counting, checks bounds, and supports no Rust-style `unsafe` to opt out of any of that. These properties give Roc code stronger safety guarantees than code written in C, Zig, Rust, and other languages that allow full access to the hardware—and the price it pays for those guarantees is a lower performance ceiling.\n\nObviously we can't extrapolate from this one result about how close Roc can get to C in the general case, but now something has been demonstrated that nobody knew was achievable before. As far as I know, this is the most optimization effort that has been put into any Roc package to date, so how close others can get to this result is a complete unknown right now. So while I'm thrilled by this result, I'm fully aware that we won't know how well it generalizes until we've optimized a wider sample of real-world Roc code bases!\n\n## [What the Performance Gap Buys](#what-the-performance-gap-buys)\n\nAn obvious question is \"Why settle for *any* amount slower?\" If you *could* get C levels of performance, why not use libdeflate itself and close that remaining gap?\n\nA pure-Roc implementation has several advantages over a pure-C one:\n\n- **Memory safety.** Roc code is fully memory-safe and has no language primitives that let you opt out of it. This code is only able to approach C levels of performance because Roc's optimization pipeline determined that many bounds checks and reference counting operations were provably safe to optimize away. Compression packages written in pure Roc don't have access to the unchecked memory operation that caused yesterday's [Brotli Remote Code Execution vulnerability](https://nodejs.org/en/blog/vulnerability/october-2026-security-releases#nodejs-brotli-decoder-out-of-bounds-write-permits-remote-code-execution-cve-2026-111497---high).\n- **No side effects.** Roc's type system [infers which functions are pure](https://roc-lang.org/docs/main/langref/functions/) and which can perform side effects. Pure functions' types use a thin arrow, like `Bool -> Bool`, whereas *effectful functions* use a thick arrow, like `Bool => Bool`. (As with memory safety, Roc enforces this and supports no way to opt out.) So when you see that roc-deflate's functions have only thin arrows in their annotations, you know they really are pure functions.\n- **Supply-Chain Security.** Roc does not have an arbitrary [FFI](https://en.wikipedia.org/wiki/Foreign_function_interface), meaning you know for sure that roc-deflate's pure functions can't even attempt to do I/O or access arbitrary memory. Given the explosion in [supply chain attacks](https://shattered.io/npm-supply-chain-attacks-2026/), it's valuable to know that the damage a malicious actor can do with a pure function in a compromised Roc package is limited to returning the wrong value, crashing, or wasting system resources. Roc packages also don't support build scripts, which was the vector used to [successfully compromise the popular Rust `arrayref` package](https://blog.rust-lang.org/2026/08/20/supply-chain-attack-on-arrayref/) two months ago.\n- **Portability.** Roc pure functions are designed to be extremely deterministic: they always return the same values when given the same arguments—not just when run on the same machine, but also on any target you compile that code to. (The functions may also crash or fail to terminate, but that behavior should also be deterministic across targets.) The only way a Roc pure function should be expected to behave differently when run on two different systems is if one system runs out of memory mid-execution.\n\nIf any of these guarantees don't hold in practice, it can only be due to a defect in Roc's compiler, the [platform](https://www.roc-lang.org/docs/main/langref/platforms/) the application is running on, or the underlying hardware. So when you see in [roc-deflate's docs](https://niclas-ahden.github.io/roc-deflate/0.4.0/) that the entire package is 100% pure functions, you can be confident you are getting all of the above properties from everything the package has to offer. The type system enforces it!\n\nThe reason we've been working so hard on all this might become clearer if you look at the proposition in reverse: would you give up guaranteed memory safety, guaranteed lack of side effects, guaranteed deterministic behavior across all targets, and the security benefits of having no exploitable build scripts in packages...for an average speedup percentage in the single digits?\n\nThat answer can legitimately vary by use case—Roc's own compiler, for example, wants [the maximum performance the hardware can deliver](https://rtfeldman.com/rust-to-zig)—but I bet a lot of people reading this can see why we're so excited to have achieved this result.\n\n## [Roc-Specific Optimizations](#roc-specific-optimizations)\n\nMost of the optimizations that improved roc-deflate's numbers came from general optimization techniques that are widely beneficial across languages. (I always recommend [Casey Muratori's Performance-Aware Programming Series](https://www.computerenhance.com/p/table-of-contents), which I paid for and learned a lot from.) Some of the optimization techniques were Roc-specific, though, and I wanted to mention them here as a reference for others. Even if you're not writing Roc code, this can also give you an idea of [how Roc achieves its performance](https://youtu.be/vzfy4EKwG_Y?si=oYa6k2pFdsRJcQW7).\n\n### [Avoid Unnecessary Sharing](#avoid-unnecessary-sharing)\n\nOne of Roc's most effective optimizations is *opportunistic mutation* (which [Koka](https://koka-lang.github.io/koka/doc/book.html#why-perceus) calls [\"Functional but In-Place\"](https://koka-lang.github.io/koka/doc/book.html#sec-fbip)). You can learn how it works in Roc's [docs on opportunistic mutation](https://www.roc-lang.org/docs/main/langref/expressions/#opportunistic-mutation), but from a performance optimization perspective, it's critically important to avoid unnecessary sharing so that values remain unique and therefore eligible for in-place mutation.\n\n### [Hoist Bounds Checks](#hoist-bounds-checks)\n\nYou can't opt out of bounds checks (e.g. getting a value out of a dynamically-sized collection) in Roc like you can in C, Zig, and Rust, but Roc's compiler can optimize them away if it knows they'd be guaranteed to pass. Bounds checks are most costly inside loops, so you can get a lot of mileage out of adding something like `if collection.len() <= highest_index_used { return 0 }` before the loop starts. This adds an additional check that looks redundant, but it can allow the optimizer to safely delete costlier checks inside the loop, once it can tell that failures would not be reachable after that early return.\n\n### [Build Lookup Tables at Compile Time](#build-lookup-tables-at-compile-time)\n\n[Roc's compile-time evaluation](https://www.roc-lang.org/docs/main/langref/compile-time/) can be used to assemble lookup tables at compile time as long as nothing depends on runtime inputs. Even better, since their lengths are known at compile time, you can do things like `Ok(entry) = lookup_table.get(5)` to do an [exhaustive pattern match](https://www.roc-lang.org/docs/main/langref/pattern-matching/#exhaustiveness) that Roc's compiler will know is valid thanks to compile-time evaluation. This avoids runtime bounds checks that non-constant tables might have to pay for.\n\n### [Consider Wrapping Arithmetic](#consider-wrapping-arithmetic)\n\nIn Roc, `a + b` desugars to `a.plus(b)`. For an integer like [`U64`](https://www.roc-lang.org/docs/main/Num/#U64), [`U64.plus`](https://www.roc-lang.org/docs/main/Num/#U64.plus) includes an overflow check, whereas [`plus_wrap`](https://www.roc-lang.org/docs/main/Num/#U64.plus_wrap) does not. Although `plus` is the safer default, [overflow checks have a runtime cost](https://danluu.com/integer-overflow), as CPUs can do wrapping integer arithmetic in one instruction. When Roc's compiler can prove that overflow won't occur, both `plus` and `plus_wrap` will optimize to the same instructions, but when it can't, you may get a speedup by choosing `plus_wrap`.\n\n## [Room for Improvement](#room-for-improvement)\n\nI'm sure there are still opportunities to improve roc-deflate's performance—especially on x64 CPUs—as well as the optimization pipeline in Roc's compiler.\n\nAt this point I feel reasonably confident that all the low-hanging fruit has been picked, but if anyone wants to try it out for themselves, [here's the script I ran to set up and run the benchmark suite on Linux](https://gist.github.com/rtfeldman/7b6830809149867b79761ffb8e0456c3). (Note that Claude Opus 5.5 generated this script, and I haven't vetted it for security; run it outside a sandbox at your own risk!) It pins both Roc compiler revisions and roc-deflate versions, so you'll want to adjust those commits if you're trying out potential improvements.\n\nFor my part, I'll be focusing on the upcoming Roc 0.1.0 release from now until it's out. It's been eight years in the making, so I'll be very happy for us to finally have a numbered release! If you'd like to learn more about Roc, check out [roc-lang.org](https://roc-lang.org) or [come say hi on Roc Zulip](https://roc.zulipchat.com/#narrow/channel/231634-beginners)!\n","body_html":"<h1 id=\"how-close-can-pure-fp-get-to-c\"><a href=\"#how-close-can-pure-fp-get-to-c\">How close can pure FP get to C?</a></h1>\n<p><em>October 22, 2026</em></p>\n<p>In <a href=\"https://kim-em.github.io/blog/2026-7-24-why-lean-is-faster-than-rust/\" rel=\"nofollow ugc noopener\">Why Lean is Faster Than Rust</a>, the author shares an impressive result: a <a href=\"https://en.wikipedia.org/wiki/Deflate\" rel=\"nofollow ugc noopener\">DEFLATE compression</a> library written in <a href=\"https://github.com/leanprover/lean4\" rel=\"nofollow ugc noopener\">Lean 4</a>, a functional programming language and proof assistant, outperforming an equivalent Rust package that <a href=\"https://crates.io/search?q=miniz_oxide\" rel=\"nofollow ugc noopener\">crates.io says</a> has been downloaded <em>over a billion times.</em> From the article:</p>\n<blockquote><p><code>lean-zip</code> beats every single compression level <code>miniz_oxide</code> provides, i.e. we&#39;re capable of providing the same compression at higher throughput. At its fastest setting we&#39;re 15% quicker and the output is 8.8% smaller.</p></blockquote>\n<p>However, the article also notes that while they managed to surpass Rust&#39;s <code>miniz_oxide</code>, they were no match for the end boss of DEFLATE performance: <a href=\"https://github.com/ebiggers/libdeflate\" rel=\"nofollow ugc noopener\">libdeflate</a>, written in C.</p>\n<blockquote><p><code>lean-zip</code> is certainly not the best here: <code>libdeflate</code> unsurprisingly blows it out of the water (unsurprisingly because this is a very carefully tuned implementation using architecture-specific SIMD, that we can&#39;t touch in Lean).</p></blockquote>\n<p>Enter <a href=\"https://roc-lang.org\" rel=\"nofollow ugc noopener\">Roc</a>, a functional programming language (but not a theorem prover) with an explicit focus on runtime performance.</p>\n<p>Roc&#39;s tagline is &quot;Fast, Friendly, Functional,&quot; and <a href=\"https://roc-lang.org/fast\" rel=\"nofollow ugc noopener\">Fast comes first</a> because both running fast <em>and</em> compiling fast have always been central goals. Roc is not a mature language (it&#39;s still weeks away from its first numbered release, 0.1.0), and its nascent package ecosystem has had almost no optimization work done on it. Still, between its language design, <a href=\"https://youtu.be/vzfy4EKwG_Y?si=oYa6k2pFdsRJcQW7\" rel=\"nofollow ugc noopener\">longstanding optimizations</a>, and <a href=\"https://rtfeldman.com/rust-to-zig\" rel=\"nofollow ugc noopener\">brand-new compiler implementation</a>, I figured Roc already had enough of a foundation in place to take on the champ: libdeflate.</p>\n<p>So I spent a bunch of time grinding through performance optimizations on <a href=\"https://github.com/niclas-ahden/roc-deflate\" rel=\"nofollow ugc noopener\">roc-deflate</a>, a package <a href=\"https://www.youtube.com/@NiclasAhden\" rel=\"nofollow ugc noopener\">Niclas Ahden</a> wrote (and <a href=\"https://youtu.be/12yVcgQHAK0?si=JETe6lec5y4jCLVL\" rel=\"nofollow ugc noopener\">uses in paid production work</a>) for DEFLATE compression. I didn&#39;t expect to beat libdeflate&#39;s performance across the board, but I wanted to see how close it could get on the non-streaming APIs (as roc-deflate hasn&#39;t implemented streaming yet), using the classic Silesia corpus for benchmarking and verifying that it produced identical outputs.</p>\n<h2 id=\"under-10-slower\"><a href=\"#under-10-slower\">Under 10% Slower</a></h2>\n<p>Here&#39;s where the benchmarks stand today, running on the 2021 M1 MacBook Pro where I did all the optimization work, as well as on an AMD Ryzen 9 3900X Ubuntu machine for an x64 comparison.</p>\n<p>roc-deflate ran these 144 benchmarks slower on average than libdeflate, in the median case <strong>8.9%</strong> slower on the Ryzen 3900X, and <strong>2.6%</strong> on the M1 MacBook Pro.</p>\n<h3 id=\"compression-on-silesia-corpus\"><a href=\"#chart\">Compression on Silesia corpus</a></h3>\n<p>M1 MacBook Pro\nRyzen 3900X Ubuntu</p>\n<p>MB/s</p>\n<p>700\n600\n500\n400\n300\n200\n100\n0</p>\n<p>file that ran fastest</p>\n<p>file that ran slowest</p>\n<p>L1</p>\n<p>L2</p>\n<p>L3</p>\n<p>L4</p>\n<p>L5</p>\n<p>L6</p>\n<p>L7</p>\n<p>L8</p>\n<p>L9</p>\n<p>L10</p>\n<p>L11</p>\n<p>L12</p>\n<p>libdeflate\nroc-deflate</p>\n<p>libdeflate at L1 compression</p>\n<p>230.57 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>248.31 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>312.26 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>601.03 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>169.98 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>284.01 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>281.14 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>344.00 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>160.21 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>268.58 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>145.93 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>476.83 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>202.92 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>225.79 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>277.57 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>529.49 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>153.99 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>257.14 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>245.80 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>309.79 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>145.28 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>239.18 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>134.66 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>419.07 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>161.68 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>184.55 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>204.86 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>453.14 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>128.05 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>203.10 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>207.66 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>249.57 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>112.78 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>198.86 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>117.18 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>352.59 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>143.60 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>168.37 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>182.07 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>409.82 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>118.08 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>185.41 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>183.69 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>228.02 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>105.68 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>181.07 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>107.00 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>323.17 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>130.85 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>169.26 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>171.11 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>415.29 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>118.92 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>183.10 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>169.42 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>223.27 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>100.60 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>173.36 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>116.62 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>324.65 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>122.04 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>158.29 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>159.07 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>382.21 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>111.14 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>171.27 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>157.19 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>209.86 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>95.51 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>162.75 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>105.93 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>300.31 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>119.94 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>158.07 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>156.88 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>376.70 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>113.68 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>164.59 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>152.16 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>207.97 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>94.48 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>158.64 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>116.63 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>294.31 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>113.71 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>148.77 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>149.00 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>356.47 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>107.59 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>156.41 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>142.45 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>197.17 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>89.37 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>151.15 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>106.32 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>278.53 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>95.14 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>133.06 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>129.45 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>287.09 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>95.87 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>140.08 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>120.63 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>170.75 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>83.22 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>125.60 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>102.48 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>229.70 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>90.27 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>125.87 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>122.34 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>311.35 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>89.73 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>133.37 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>115.52 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>167.01 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>76.99 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>123.12 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>90.40 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>237.29 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>70.60 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>107.04 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>96.85 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>221.32 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>82.91 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>122.89 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>79.91 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>129.19 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>67.48 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>96.76 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>102.50 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>178.60 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>72.83 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>107.54 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>98.92 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>246.59 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>81.43 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>122.02 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>84.85 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>134.11 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>66.36 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>101.16 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>90.67 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>194.35 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>54.23 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>75.96 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>66.46 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>157.22 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>70.52 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>117.53 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>46.77 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>91.00 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>59.49 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>71.34 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>102.43 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>128.20 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>56.93 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>79.18 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>70.19 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>174.91 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>70.27 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>115.95 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>51.20 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>96.46 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>59.40 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>75.99 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>90.26 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>141.60 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>37.50 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>39.17 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>43.21 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>83.68 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>52.45 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>106.76 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>24.87 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>55.69 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>51.86 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>45.55 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>91.30 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>80.95 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>39.56 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>43.00 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>45.70 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>91.28 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>52.69 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>101.66 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>27.81 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>60.04 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>51.65 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>48.78 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>81.01 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>86.27 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>34.82 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>27.51 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>38.60 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>58.64 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>47.26 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>106.10 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>20.65 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>43.95 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>51.18 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>40.57 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>91.69 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>68.13 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>36.73 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>30.48 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>40.95 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>64.32 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>48.05 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>101.46 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>22.85 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>47.64 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>50.68 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>43.36 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>80.68 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>73.29 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>12.07 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>14.87 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>16.07 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>7.51 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>18.09 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>16.97 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>8.64 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>14.74 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>24.08 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>10.10 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>34.15 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>11.46 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>12.97 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>14.67 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>15.47 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>7.19 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>18.02 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>17.23 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>9.63 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>14.59 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>22.93 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>11.18 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>32.15 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>10.73 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>8.85 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>10.27 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>8.76 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>4.82 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>13.56 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>12.91 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>6.49 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>8.46 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>19.43 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>6.77 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>26.05 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>6.60 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>10.10 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>10.53 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>8.19 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>4.74 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>14.03 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>13.62 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>7.71 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>8.68 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>18.87 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>8.07 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>24.93 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>6.51 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>7.35 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>7.97 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>4.26 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>3.51 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>11.45 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>11.40 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>5.59 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>5.92 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>18.10 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>5.82 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>23.50 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>4.19 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>8.59 MB/s compressing dickens</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>8.22 MB/s compressing mozilla</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>3.83 MB/s compressing mr</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>3.48 MB/s compressing nci</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>11.99 MB/s compressing ooffice</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>12.21 MB/s compressing osdb</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>6.87 MB/s compressing reymont</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>6.03 MB/s compressing samba</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>17.74 MB/s compressing sao</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>7.11 MB/s compressing webster</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>22.60 MB/s compressing x-ray</p>\n<p>(median across 15 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>4.18 MB/s compressing xml</p>\n<p>(median across 15 runs)</p>\n<p>Compression Level</p>\n<p>MB/s</p>\n<p>700\n600\n500\n400\n300\n200\n100\n0</p>\n<p>file that ran fastest\nfile that ran slowest</p>\n<p>L1</p>\n<p>L2</p>\n<p>L3</p>\n<p>L4</p>\n<p>L5</p>\n<p>L6</p>\n<p>L7</p>\n<p>L8</p>\n<p>L9</p>\n<p>L10</p>\n<p>L11</p>\n<p>L12</p>\n<p>libdeflate\nroc-deflate</p>\n<p>libdeflate at L1 compression</p>\n<p>191.10 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>235.50 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>261.70 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>387.30 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>167.90 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>254.70 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>229.60 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>291.00 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>157.40 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>207.00 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>142.20 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L1 compression</p>\n<p>411.30 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>182.30 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>204.50 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>228.90 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>428.60 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>144.60 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>222.30 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>217.30 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>270.30 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>138.50 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>213.90 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>130.80 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L1 compression</p>\n<p>353.80 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>138.50 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>162.80 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>153.40 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>286.50 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>120.40 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>175.30 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>156.80 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>210.50 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>104.20 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>163.50 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>111.60 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L2 compression</p>\n<p>258.40 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>121.20 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>144.50 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>145.30 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>326.40 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>105.10 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>155.00 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>146.00 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>188.40 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>94.10 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>151.60 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>95.50 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L2 compression</p>\n<p>248.60 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>112.90 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>152.80 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>132.10 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>304.30 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>113.00 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>164.00 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>128.00 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>191.40 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>94.50 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>143.70 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>112.20 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L3 compression</p>\n<p>209.90 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>100.80 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>132.50 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>125.30 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>301.90 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>97.90 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>148.80 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>120.80 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>169.40 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>84.80 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>133.90 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>95.10 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L3 compression</p>\n<p>231.70 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>100.80 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>144.50 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>123.40 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>254.00 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>109.70 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>151.90 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>118.90 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>178.70 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>89.10 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>129.70 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>111.30 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L4 compression</p>\n<p>201.50 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>91.90 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>126.60 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>117.60 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>282.80 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>95.50 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>138.00 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>106.80 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>159.20 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>81.50 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>125.00 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>95.60 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L4 compression</p>\n<p>215.50 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>82.40 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>120.00 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>103.10 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>250.40 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>89.30 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>128.80 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>94.60 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>152.10 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>74.80 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>112.20 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>93.70 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L5 compression</p>\n<p>198.40 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>73.50 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>105.70 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>96.60 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>247.90 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>77.50 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>116.60 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>86.20 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>133.00 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>68.10 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>100.10 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>82.10 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L5 compression</p>\n<p>182.10 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>65.40 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>102.90 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>81.60 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>203.10 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>78.50 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>118.80 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>71.00 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>120.10 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>64.40 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>91.80 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>94.80 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L6 compression</p>\n<p>168.30 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>57.80 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>89.40 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>74.10 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>188.20 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>70.60 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>107.80 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>60.90 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>105.40 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>59.20 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>81.30 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>83.20 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L6 compression</p>\n<p>149.50 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>49.60 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>76.10 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>56.30 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>150.20 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>69.10 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>113.80 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>39.90 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>85.90 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>53.10 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>66.10 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>94.20 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L7 compression</p>\n<p>119.90 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>45.20 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>67.20 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>52.40 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>141.70 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>61.10 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>106.10 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>36.20 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>76.50 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>52.80 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>59.40 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>81.60 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L7 compression</p>\n<p>108.40 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>32.10 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>41.40 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>35.80 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>80.70 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>50.40 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>97.80 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>20.60 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>53.40 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>46.60 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>40.00 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>78.30 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L8 compression</p>\n<p>72.60 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>30.00 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>36.80 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>33.90 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>75.50 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>45.60 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>90.20 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>19.50 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>49.00 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>44.50 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>37.10 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>72.10 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L8 compression</p>\n<p>66.40 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>29.00 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>29.10 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>32.50 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>58.50 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>45.00 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>95.30 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>16.90 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>41.60 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>45.60 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>33.90 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>78.60 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L9 compression</p>\n<p>57.90 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>27.10 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>26.30 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>30.60 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>54.40 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>41.20 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>90.80 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>15.90 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>38.70 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>43.30 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>31.70 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>72.70 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L9 compression</p>\n<p>54.80 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>12.10 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>14.80 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>16.20 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>7.30 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>18.20 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>16.10 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>8.70 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>14.40 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>23.30 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>10.00 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>34.70 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L10 compression</p>\n<p>10.80 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>12.30 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>13.70 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>14.70 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>6.80 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>16.80 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>15.50 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>9.00 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>13.60 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>20.60 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>10.20 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>29.40 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L10 compression</p>\n<p>9.80 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>8.80 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>10.30 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>9.30 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>4.70 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>13.70 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>12.30 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>6.50 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>8.40 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>18.90 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>6.70 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>26.80 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L11 compression</p>\n<p>6.20 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>9.50 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>9.90 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>8.30 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>4.50 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>13.00 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>12.30 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>7.10 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>8.30 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>17.00 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>7.30 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>23.00 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L11 compression</p>\n<p>6.00 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>7.40 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>8.00 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>4.70 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>3.40 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>11.50 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>10.90 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>5.60 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>5.90 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>17.70 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>5.80 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>24.60 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>libdeflate at L12 compression</p>\n<p>4.00 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>8.10 MB/s compressing dickens</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>7.80 MB/s compressing mozilla</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>4.10 MB/s compressing mr</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>3.30 MB/s compressing nci</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>11.20 MB/s compressing ooffice</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>11.10 MB/s compressing osdb</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>6.30 MB/s compressing reymont</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>5.80 MB/s compressing samba</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>15.80 MB/s compressing sao</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>6.40 MB/s compressing webster</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>21.00 MB/s compressing x-ray</p>\n<p>(median across 7 runs)</p>\n<p>roc-deflate at L12 compression</p>\n<p>3.90 MB/s compressing xml</p>\n<p>(median across 7 runs)</p>\n<p>Compression Level</p>\n<p>So while we didn&#39;t outperform the champ on average, a median slowdown percentage in the single digits compared to such a carefully-tuned SIMD-powered C library is <em>wild.</em> It&#39;s frankly not a result I knew was achievable going in, since Roc is a functional language with automatic memory management racing against code that doesn&#39;t have to do bounds checks. (Bounds checks have a cost, but then again, the last time a skipped bounds check in C compression code led to a major Remote Code Execution vulnerability <a href=\"https://nodejs.org/en/blog/vulnerability/october-2026-security-releases#nodejs-brotli-decoder-out-of-bounds-write-permits-remote-code-execution-cve-2026-111497---high\" rel=\"nofollow ugc noopener\">was yesterday</a>.)</p>\n<p>The graph shows more detail than just the median gap. On the worst-case inputs, roc-deflate was 18% slower than libdeflate, but on the best-case inputs, roc-deflate was slightly over 18% <em>faster!</em> That&#39;s not because Roc has some magical optimization that C can&#39;t access; it&#39;s just that the two implementations are different, and although on average roc-deflate is slower, for certain inputs it happens to be faster. So while it&#39;s <em>possible</em> to get a speedup by switching from libdeflate to roc-deflate, you shouldn&#39;t expect it on average.</p>\n<p>To be clear, C&#39;s performance ceiling is higher than Roc&#39;s. For any input where roc-deflate currently outperforms libdeflate, C code can close that gap. The reverse is not true; Roc code is memory-safe, does automatic reference counting, checks bounds, and supports no Rust-style <code>unsafe</code> to opt out of any of that. These properties give Roc code stronger safety guarantees than code written in C, Zig, Rust, and other languages that allow full access to the hardware—and the price it pays for those guarantees is a lower performance ceiling.</p>\n<p>Obviously we can&#39;t extrapolate from this one result about how close Roc can get to C in the general case, but now something has been demonstrated that nobody knew was achievable before. As far as I know, this is the most optimization effort that has been put into any Roc package to date, so how close others can get to this result is a complete unknown right now. So while I&#39;m thrilled by this result, I&#39;m fully aware that we won&#39;t know how well it generalizes until we&#39;ve optimized a wider sample of real-world Roc code bases!</p>\n<h2 id=\"what-the-performance-gap-buys\"><a href=\"#what-the-performance-gap-buys\">What the Performance Gap Buys</a></h2>\n<p>An obvious question is &quot;Why settle for <em>any</em> amount slower?&quot; If you <em>could</em> get C levels of performance, why not use libdeflate itself and close that remaining gap?</p>\n<p>A pure-Roc implementation has several advantages over a pure-C one:</p>\n<ul><li><strong>Memory safety.</strong> Roc code is fully memory-safe and has no language primitives that let you opt out of it. This code is only able to approach C levels of performance because Roc&#39;s optimization pipeline determined that many bounds checks and reference counting operations were provably safe to optimize away. Compression packages written in pure Roc don&#39;t have access to the unchecked memory operation that caused yesterday&#39;s <a href=\"https://nodejs.org/en/blog/vulnerability/october-2026-security-releases#nodejs-brotli-decoder-out-of-bounds-write-permits-remote-code-execution-cve-2026-111497---high\" rel=\"nofollow ugc noopener\">Brotli Remote Code Execution vulnerability</a>.</li><li><strong>No side effects.</strong> Roc&#39;s type system <a href=\"https://roc-lang.org/docs/main/langref/functions/\" rel=\"nofollow ugc noopener\">infers which functions are pure</a> and which can perform side effects. Pure functions&#39; types use a thin arrow, like <code>Bool -&gt; Bool</code>, whereas <em>effectful functions</em> use a thick arrow, like <code>Bool =&gt; Bool</code>. (As with memory safety, Roc enforces this and supports no way to opt out.) So when you see that roc-deflate&#39;s functions have only thin arrows in their annotations, you know they really are pure functions.</li><li><strong>Supply-Chain Security.</strong> Roc does not have an arbitrary <a href=\"https://en.wikipedia.org/wiki/Foreign_function_interface\" rel=\"nofollow ugc noopener\">FFI</a>, meaning you know for sure that roc-deflate&#39;s pure functions can&#39;t even attempt to do I/O or access arbitrary memory. Given the explosion in <a href=\"https://shattered.io/npm-supply-chain-attacks-2026/\" rel=\"nofollow ugc noopener\">supply chain attacks</a>, it&#39;s valuable to know that the damage a malicious actor can do with a pure function in a compromised Roc package is limited to returning the wrong value, crashing, or wasting system resources. Roc packages also don&#39;t support build scripts, which was the vector used to <a href=\"https://blog.rust-lang.org/2026/08/20/supply-chain-attack-on-arrayref/\" rel=\"nofollow ugc noopener\">successfully compromise the popular Rust <code>arrayref</code> package</a> two months ago.</li><li><strong>Portability.</strong> Roc pure functions are designed to be extremely deterministic: they always return the same values when given the same arguments—not just when run on the same machine, but also on any target you compile that code to. (The functions may also crash or fail to terminate, but that behavior should also be deterministic across targets.) The only way a Roc pure function should be expected to behave differently when run on two different systems is if one system runs out of memory mid-execution.</li></ul>\n<p>If any of these guarantees don&#39;t hold in practice, it can only be due to a defect in Roc&#39;s compiler, the <a href=\"https://www.roc-lang.org/docs/main/langref/platforms/\" rel=\"nofollow ugc noopener\">platform</a> the application is running on, or the underlying hardware. So when you see in <a href=\"https://niclas-ahden.github.io/roc-deflate/0.4.0/\" rel=\"nofollow ugc noopener\">roc-deflate&#39;s docs</a> that the entire package is 100% pure functions, you can be confident you are getting all of the above properties from everything the package has to offer. The type system enforces it!</p>\n<p>The reason we&#39;ve been working so hard on all this might become clearer if you look at the proposition in reverse: would you give up guaranteed memory safety, guaranteed lack of side effects, guaranteed deterministic behavior across all targets, and the security benefits of having no exploitable build scripts in packages...for an average speedup percentage in the single digits?</p>\n<p>That answer can legitimately vary by use case—Roc&#39;s own compiler, for example, wants <a href=\"https://rtfeldman.com/rust-to-zig\" rel=\"nofollow ugc noopener\">the maximum performance the hardware can deliver</a>—but I bet a lot of people reading this can see why we&#39;re so excited to have achieved this result.</p>\n<h2 id=\"roc-specific-optimizations\"><a href=\"#roc-specific-optimizations\">Roc-Specific Optimizations</a></h2>\n<p>Most of the optimizations that improved roc-deflate&#39;s numbers came from general optimization techniques that are widely beneficial across languages. (I always recommend <a href=\"https://www.computerenhance.com/p/table-of-contents\" rel=\"nofollow ugc noopener\">Casey Muratori&#39;s Performance-Aware Programming Series</a>, which I paid for and learned a lot from.) Some of the optimization techniques were Roc-specific, though, and I wanted to mention them here as a reference for others. Even if you&#39;re not writing Roc code, this can also give you an idea of <a href=\"https://youtu.be/vzfy4EKwG_Y?si=oYa6k2pFdsRJcQW7\" rel=\"nofollow ugc noopener\">how Roc achieves its performance</a>.</p>\n<h3 id=\"avoid-unnecessary-sharing\"><a href=\"#avoid-unnecessary-sharing\">Avoid Unnecessary Sharing</a></h3>\n<p>One of Roc&#39;s most effective optimizations is <em>opportunistic mutation</em> (which <a href=\"https://koka-lang.github.io/koka/doc/book.html#why-perceus\" rel=\"nofollow ugc noopener\">Koka</a> calls <a href=\"https://koka-lang.github.io/koka/doc/book.html#sec-fbip\" rel=\"nofollow ugc noopener\">&quot;Functional but In-Place&quot;</a>). You can learn how it works in Roc&#39;s <a href=\"https://www.roc-lang.org/docs/main/langref/expressions/#opportunistic-mutation\" rel=\"nofollow ugc noopener\">docs on opportunistic mutation</a>, but from a performance optimization perspective, it&#39;s critically important to avoid unnecessary sharing so that values remain unique and therefore eligible for in-place mutation.</p>\n<h3 id=\"hoist-bounds-checks\"><a href=\"#hoist-bounds-checks\">Hoist Bounds Checks</a></h3>\n<p>You can&#39;t opt out of bounds checks (e.g. getting a value out of a dynamically-sized collection) in Roc like you can in C, Zig, and Rust, but Roc&#39;s compiler can optimize them away if it knows they&#39;d be guaranteed to pass. Bounds checks are most costly inside loops, so you can get a lot of mileage out of adding something like <code>if collection.len() &lt;= highest_index_used { return 0 }</code> before the loop starts. This adds an additional check that looks redundant, but it can allow the optimizer to safely delete costlier checks inside the loop, once it can tell that failures would not be reachable after that early return.</p>\n<h3 id=\"build-lookup-tables-at-compile-time\"><a href=\"#build-lookup-tables-at-compile-time\">Build Lookup Tables at Compile Time</a></h3>\n<p><a href=\"https://www.roc-lang.org/docs/main/langref/compile-time/\" rel=\"nofollow ugc noopener\">Roc&#39;s compile-time evaluation</a> can be used to assemble lookup tables at compile time as long as nothing depends on runtime inputs. Even better, since their lengths are known at compile time, you can do things like <code>Ok(entry) = lookup_table.get(5)</code> to do an <a href=\"https://www.roc-lang.org/docs/main/langref/pattern-matching/#exhaustiveness\" rel=\"nofollow ugc noopener\">exhaustive pattern match</a> that Roc&#39;s compiler will know is valid thanks to compile-time evaluation. This avoids runtime bounds checks that non-constant tables might have to pay for.</p>\n<h3 id=\"consider-wrapping-arithmetic\"><a href=\"#consider-wrapping-arithmetic\">Consider Wrapping Arithmetic</a></h3>\n<p>In Roc, <code>a + b</code> desugars to <code>a.plus(b)</code>. For an integer like <a href=\"https://www.roc-lang.org/docs/main/Num/#U64\" rel=\"nofollow ugc noopener\"><code>U64</code></a>, <a href=\"https://www.roc-lang.org/docs/main/Num/#U64.plus\" rel=\"nofollow ugc noopener\"><code>U64.plus</code></a> includes an overflow check, whereas <a href=\"https://www.roc-lang.org/docs/main/Num/#U64.plus_wrap\" rel=\"nofollow ugc noopener\"><code>plus_wrap</code></a> does not. Although <code>plus</code> is the safer default, <a href=\"https://danluu.com/integer-overflow\" rel=\"nofollow ugc noopener\">overflow checks have a runtime cost</a>, as CPUs can do wrapping integer arithmetic in one instruction. When Roc&#39;s compiler can prove that overflow won&#39;t occur, both <code>plus</code> and <code>plus_wrap</code> will optimize to the same instructions, but when it can&#39;t, you may get a speedup by choosing <code>plus_wrap</code>.</p>\n<h2 id=\"room-for-improvement\"><a href=\"#room-for-improvement\">Room for Improvement</a></h2>\n<p>I&#39;m sure there are still opportunities to improve roc-deflate&#39;s performance—especially on x64 CPUs—as well as the optimization pipeline in Roc&#39;s compiler.</p>\n<p>At this point I feel reasonably confident that all the low-hanging fruit has been picked, but if anyone wants to try it out for themselves, <a href=\"https://gist.github.com/rtfeldman/7b6830809149867b79761ffb8e0456c3\" rel=\"nofollow ugc noopener\">here&#39;s the script I ran to set up and run the benchmark suite on Linux</a>. (Note that Claude Opus 5.5 generated this script, and I haven&#39;t vetted it for security; run it outside a sandbox at your own risk!) It pins both Roc compiler revisions and roc-deflate versions, so you&#39;ll want to adjust those commits if you&#39;re trying out potential improvements.</p>\n<p>For my part, I&#39;ll be focusing on the upcoming Roc 0.1.0 release from now until it&#39;s out. It&#39;s been eight years in the making, so I&#39;ll be very happy for us to finally have a numbered release! If you&#39;d like to learn more about Roc, check out <a href=\"https://roc-lang.org\" rel=\"nofollow ugc noopener\">roc-lang.org</a> or <a href=\"https://roc.zulipchat.com/#narrow/channel/231634-beginners\" rel=\"nofollow ugc noopener\">come say hi on Roc Zulip</a>!</p>","headings":[{"level":1,"text":"How close can pure FP get to C?","id":"how-close-can-pure-fp-get-to-c"},{"level":2,"text":"Under 10% Slower","id":"under-10-slower"},{"level":3,"text":"Compression on Silesia corpus","id":"compression-on-silesia-corpus"},{"level":2,"text":"What the Performance Gap Buys","id":"what-the-performance-gap-buys"},{"level":2,"text":"Roc-Specific Optimizations","id":"roc-specific-optimizations"},{"level":3,"text":"Avoid Unnecessary Sharing","id":"avoid-unnecessary-sharing"},{"level":3,"text":"Hoist Bounds Checks","id":"hoist-bounds-checks"},{"level":3,"text":"Build Lookup Tables at Compile Time","id":"build-lookup-tables-at-compile-time"},{"level":3,"text":"Consider Wrapping Arithmetic","id":"consider-wrapping-arithmetic"},{"level":2,"text":"Room for Improvement","id":"room-for-improvement"}]}}