Skip to content

Instantly share code, notes, and snippets.

@niwinz
Last active August 27, 2017 11:58
Show Gist options
  • Save niwinz/03d232d684a86e810091d18ee74cb332 to your computer and use it in GitHub Desktop.
Save niwinz/03d232d684a86e810091d18ee74cb332 to your computer and use it in GitHub Desktop.
#!/usr/bin/env boot
;; BOOT_CLOJURE_NAME=org.clojure/clojure
;; BOOT_CLOJURE_VERSION=1.8.0
;; BOOT_VERSION=2.5.5
;; BOOT_JVM_OPTIONS="-Xms1g -Xmx1g -XX:+UseG1GC -XX:+AggressiveOpts -server -Dclojure.compiler.direct-linking=true"
(set-env! :repositories #(conj % ["bintray" {:url "http://dl.bintray.com/nitram509/jbrotli"}]))
(set-env! :dependencies '[[criterium "0.4.4"]
[org.xerial.snappy/snappy-java "1.1.2.6"]
[com.github.luben/zstd-jni "1.1.0"]
[net.jpountz.lz4/lz4 "1.3.0"]])
(set! *warn-on-reflection* true)
(import 'java.util.Random)
(import 'org.xerial.snappy.Snappy)
(import 'net.jpountz.lz4.LZ4Factory)
(import 'net.jpountz.lz4.LZ4Compressor)
(import 'net.jpountz.lz4.LZ4FastDecompressor)
(import 'com.github.luben.zstd.Zstd)
(require '[criterium.core :refer [bench quick-bench with-progress-reporting]])
;; --- Helpers
(def data "
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Pellentesque bibendum neque ut feugiat vulputate. Donec non mi
maximus, fermentum mi vitae, egestas orci. Aliquam lobortis, nunc sit
amet aliquet auctor, eros lorem euismod ante, eu aliquet felis libero
eget neque. Phasellus blandit, lacus ac rhoncus condimentum, nulla
risus ultrices ex, et venenatis enim dolor nec velit. Nunc dapibus nec
sapien eu tristique. Donec vel suscipit purus. Pellentesque mollis
eros in hendrerit faucibus. Vestibulum ante ipsum primis in faucibus
orci luctus et ultrices posuere cubilia Curae; Donec a eleifend
odio. Morbi nec elementum quam. Donec gravida metus vel sem aliquam
pellentesque. Donec hendrerit nisl in mauris dapibus, nec auctor
mauris dignissim. Mauris ante mi, pretium nec interdum quis, maximus
quis tortor. Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Curabitur non nibh bibendum, viverra enim luctus, commodo dolor.
Proin aliquet, risus at convallis imperdiet, sem ligula facilisis
ante, vitae consectetur justo massa quis velit. Fusce eu urna porta,
pharetra felis in, malesuada augue. Quisque sit amet arcu a turpis
blandit molestie. In ac lacus eu odio pulvinar faucibus. In vulputate
at libero a tempor. Etiam eget neque aliquet, accumsan est quis,
convallis tortor. Cum sociis natoque penatibus et magnis dis
parturient montes, nascetur ridiculus mus. Nullam hendrerit erat quam,
sed imperdiet dui efficitur eget. Sed elementum, eros sed dapibus
lacinia, elit augue iaculis leo, at gravida tortor elit non
mi. Praesent volutpat lacus molestie risus convallis
malesuada. Curabitur sed ex eu felis venenatis auctor. Fusce convallis
turpis ac nibh commodo luctus. Sed commodo dui non arcu mattis
sagittis. Ut at porta nulla, in sagittis sapien. Duis lectus ligula,
dignissim id dolor id, porttitor posuere tellus.
Nulla sit amet venenatis tellus. Donec non enim mi. Vestibulum purus
leo, dictum sed ligula quis, lacinia vehicula urna. Aenean at libero
varius, semper urna at, placerat sem. Suspendisse feugiat, diam vel
porttitor hendrerit, lectus arcu varius ipsum, non eleifend sem dui
sit amet ligula. Ut consectetur diam ante, eget varius justo finibus
vel. Phasellus at porttitor nisl, ac hendrerit dui. Nullam egestas
malesuada arcu quis efficitur. Nulla consectetur, tellus ut fringilla
rhoncus, sapien purus accumsan nisl, quis dictum odio nunc sed
lacus. Integer fringilla maximus consectetur. Praesent eu diam sed
justo blandit scelerisque. Nam vel mollis sapien, tempus ullamcorper
odio. Phasellus in lacus at odio euismod convallis. Integer sed
condimentum eros, eu rhoncus quam. Praesent rutrum sem ante. Curabitur
a ornare quam.
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Pellentesque bibendum neque ut feugiat vulputate. Donec non mi
maximus, fermentum mi vitae, egestas orci. Aliquam lobortis, nunc sit
amet aliquet auctor, eros lorem euismod ante, eu aliquet felis libero
eget neque. Phasellus blandit, lacus ac rhoncus condimentum, nulla
risus ultrices ex, et venenatis enim dolor nec velit. Nunc dapibus nec
sapien eu tristique. Donec vel suscipit purus. Pellentesque mollis
eros in hendrerit faucibus. Vestibulum ante ipsum primis in faucibus
orci luctus et ultrices posuere cubilia Curae; Donec a eleifend
odio. Morbi nec elementum quam. Donec gravida metus vel sem aliquam
pellentesque. Donec hendrerit nisl in mauris dapibus, nec auctor
mauris dignissim. Mauris ante mi, pretium nec interdum quis, maximus
quis tortor. Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Curabitur non nibh bibendum, viverra enim luctus, commodo dolor.
Proin aliquet, risus at convallis imperdiet, sem ligula facilisis
ante, vitae consectetur justo massa quis velit. Fusce eu urna porta,
pharetra felis in, malesuada augue. Quisque sit amet arcu a turpis
blandit molestie. In ac lacus eu odio pulvinar faucibus. In vulputate
at libero a tempor. Etiam eget neque aliquet, accumsan est quis,
convallis tortor. Cum sociis natoque penatibus et magnis dis
parturient montes, nascetur ridiculus mus. Nullam hendrerit erat quam,
sed imperdiet dui efficitur eget. Sed elementum, eros sed dapibus
lacinia, elit augue iaculis leo, at gravida tortor elit non
mi. Praesent volutpat lacus molestie risus convallis
malesuada. Curabitur sed ex eu felis venenatis auctor. Fusce convallis
turpis ac nibh commodo luctus. Sed commodo dui non arcu mattis
sagittis. Ut at porta nulla, in sagittis sapien. Duis lectus ligula,
dignissim id dolor id, porttitor posuere tellus.
Nulla sit amet venenatis tellus. Donec non enim mi. Vestibulum purus
leo, dictum sed ligula quis, lacinia vehicula urna. Aenean at libero
varius, semper urna at, placerat sem. Suspendisse feugiat, diam vel
porttitor hendrerit, lectus arcu varius ipsum, non eleifend sem dui
sit amet ligula. Ut consectetur diam ante, eget varius justo finibus
vel. Phasellus at porttitor nisl, ac hendrerit dui. Nullam egestas
malesuada arcu quis efficitur. Nulla consectetur, tellus ut fringilla
rhoncus, sapien purus accumsan nisl, quis dictum odio nunc sed
lacus. Integer fringilla maximus consectetur. Praesent eu diam sed
justo blandit scelerisque. Nam vel mollis sapien, tempus ullamcorper
odio. Phasellus in lacus at odio euismod convallis. Integer sed
condimentum eros, eu rhoncus quam. Praesent rutrum sem ante. Curabitur
a ornare quam.
")
(defn generate-data
[]
(.getBytes ^String data "UTF-8"))
;; --- Initialization
(def ^LZ4Factory lz4-factory (LZ4Factory/fastestInstance))
(def ^LZ4Compressor lz4-compressor (.fastCompressor lz4-factory))
(def ^LZ4FastDecompressor lz4-decompressor (.fastDecompressor lz4-factory))
(def zstd-level 1)
;; --- Benchmark Data
(def uncompressed-data (generate-data))
(def original-size (count uncompressed-data))
(def snappy-compressed-data (Snappy/compress uncompressed-data))
(def lz4-compressed-data (.compress lz4-compressor uncompressed-data))
(def zstd-compressed-data (Zstd/compress uncompressed-data ^long zstd-level))
;; --- Benchmark Functions
(defn bench-snappy-compression
[]
(Snappy/compress ^bytes uncompressed-data))
(defn bench-snappy-uncompression
[]
(Snappy/uncompress ^bytes snappy-compressed-data))
(defn bench-lz4-compression
[]
(.compress lz4-compressor ^bytes uncompressed-data))
(defn bench-lz4-uncompression
[]
(.decompress lz4-decompressor
^bytes lz4-compressed-data
^int original-size))
(defn bench-zstd-compression
[]
(Zstd/compress ^bytes uncompressed-data ^long zstd-level))
(defn bench-zstd-uncompression
[]
(Zstd/decompress ^bytes zstd-compressed-data ^int original-size))
(defn -main
[& args]
(println "\nSize comparison:")
(println "Original: " (count uncompressed-data) "bytes")
(println "Snappy: " (count snappy-compressed-data) "bytes")
(println "LZ4: " (count lz4-compressed-data) "bytes")
(println "Zstd: " (count zstd-compressed-data) "bytes")
(do
(println "\nsnappy:compression")
(quick-bench (bench-snappy-compression) :verbose)
(println "\nsnappy:uncompression")
(quick-bench (bench-snappy-uncompression) :verbose)
(println "\nlz4:compression")
(quick-bench (bench-lz4-compression) :verbose)
(println "\nlz4:uncompression")
(quick-bench (bench-lz4-uncompression) :verbose)
(println "\nzstd:compression")
(quick-bench (bench-zstd-compression) :verbose)
(println "\nzstd:uncompression")
(quick-bench (bench-zstd-uncompression) :verbose)
)
)
Size comparison:
Original: 5500 bytes
Snappy: 1888 bytes
LZ4: 1871 bytes
Zstd: 1239 bytes
snappy:compression
amd64 Linux 4.4.22-1-lts 4 cpu(s)
OpenJDK 64-Bit Server VM 25.102-b14
Runtime arguments: -Xms1g -Xmx1g -XX:+UseG1GC -XX:+AggressiveOpts -Dclojure.compiler.direct-linking=true -Dboot.app.path=/home/niwi/bin/boot
Evaluation count : 38148 in 6 samples of 6358 calls.
Execution time sample mean : 15.939866 µs
Execution time mean : 15.940166 µs
Execution time sample std-deviation : 169.443316 ns
Execution time std-deviation : 177.073406 ns
Execution time lower quantile : 15.733521 µs ( 2.5%)
Execution time upper quantile : 16.134124 µs (97.5%)
Overhead used : 8.128448 ns
snappy:uncompression
amd64 Linux 4.4.22-1-lts 4 cpu(s)
OpenJDK 64-Bit Server VM 25.102-b14
Runtime arguments: -Xms1g -Xmx1g -XX:+UseG1GC -XX:+AggressiveOpts -Dclojure.compiler.direct-linking=true -Dboot.app.path=/home/niwi/bin/boot
Evaluation count : 215526 in 6 samples of 35921 calls.
Execution time sample mean : 2.789171 µs
Execution time mean : 2.789251 µs
Execution time sample std-deviation : 43.668779 ns
Execution time std-deviation : 47.591622 ns
Execution time lower quantile : 2.741830 µs ( 2.5%)
Execution time upper quantile : 2.842026 µs (97.5%)
Overhead used : 8.128448 ns
lz4:compression
amd64 Linux 4.4.22-1-lts 4 cpu(s)
OpenJDK 64-Bit Server VM 25.102-b14
Runtime arguments: -Xms1g -Xmx1g -XX:+UseG1GC -XX:+AggressiveOpts -Dclojure.compiler.direct-linking=true -Dboot.app.path=/home/niwi/bin/boot
Evaluation count : 64470 in 6 samples of 10745 calls.
Execution time sample mean : 9.387533 µs
Execution time mean : 9.387533 µs
Execution time sample std-deviation : 120.745726 ns
Execution time std-deviation : 121.575286 ns
Execution time lower quantile : 9.297546 µs ( 2.5%)
Execution time upper quantile : 9.581689 µs (97.5%)
Overhead used : 8.128448 ns
Found 1 outliers in 6 samples (16.6667 %)
low-severe 1 (16.6667 %)
Variance from outliers : 13.8889 % Variance is moderately inflated by outliers
lz4:uncompression
amd64 Linux 4.4.22-1-lts 4 cpu(s)
OpenJDK 64-Bit Server VM 25.102-b14
Runtime arguments: -Xms1g -Xmx1g -XX:+UseG1GC -XX:+AggressiveOpts -Dclojure.compiler.direct-linking=true -Dboot.app.path=/home/niwi/bin/boot
Evaluation count : 131106 in 6 samples of 21851 calls.
Execution time sample mean : 4.622484 µs
Execution time mean : 4.622318 µs
Execution time sample std-deviation : 62.585152 ns
Execution time std-deviation : 67.411418 ns
Execution time lower quantile : 4.543771 µs ( 2.5%)
Execution time upper quantile : 4.713306 µs (97.5%)
Overhead used : 8.128448 ns
zstd:compression
amd64 Linux 4.4.22-1-lts 4 cpu(s)
OpenJDK 64-Bit Server VM 25.102-b14
Runtime arguments: -Xms1g -Xmx1g -XX:+UseG1GC -XX:+AggressiveOpts -Dclojure.compiler.direct-linking=true -Dboot.app.path=/home/niwi/bin/boot
Evaluation count : 33018 in 6 samples of 5503 calls.
Execution time sample mean : 18.310950 µs
Execution time mean : 18.310950 µs
Execution time sample std-deviation : 203.716216 ns
Execution time std-deviation : 215.136814 ns
Execution time lower quantile : 18.020925 µs ( 2.5%)
Execution time upper quantile : 18.562508 µs (97.5%)
Overhead used : 8.128448 ns
zstd:uncompression
amd64 Linux 4.4.22-1-lts 4 cpu(s)
OpenJDK 64-Bit Server VM 25.102-b14
Runtime arguments: -Xms1g -Xmx1g -XX:+UseG1GC -XX:+AggressiveOpts -Dclojure.compiler.direct-linking=true -Dboot.app.path=/home/niwi/bin/boot
Evaluation count : 73530 in 6 samples of 12255 calls.
Execution time sample mean : 8.244839 µs
Execution time mean : 8.244839 µs
Execution time sample std-deviation : 129.557439 ns
Execution time std-deviation : 131.562930 ns
Execution time lower quantile : 8.134237 µs ( 2.5%)
Execution time upper quantile : 8.444877 µs (97.5%)
Overhead used : 8.128448 ns
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment