EXPERIMENTAL: Swap Snappy implementation org.xerial.snappy/snappy-java -> org.iq80.snappy/snappy
This (native Java) implementation appears to be about as fast as the old (JNI) implementation, but has better support across more platforms. Going to evaluate stability on this branch for possible later merging into master.
This commit is contained in:
parent
fdff6aacd1
commit
3e178dabf3
4 changed files with 24 additions and 7 deletions
|
|
@ -2,8 +2,8 @@
|
||||||
:description "Clojure serialization library"
|
:description "Clojure serialization library"
|
||||||
:url "https://github.com/ptaoussanis/nippy"
|
:url "https://github.com/ptaoussanis/nippy"
|
||||||
:license {:name "Eclipse Public License"}
|
:license {:name "Eclipse Public License"}
|
||||||
:dependencies [[org.clojure/clojure "1.3.0"]
|
:dependencies [[org.clojure/clojure "1.3.0"]
|
||||||
[org.xerial.snappy/snappy-java "1.0.5-M3"]]
|
[org.iq80.snappy/snappy "0.2"]]
|
||||||
:profiles {:1.3 {:dependencies [[org.clojure/clojure "1.3.0"]]}
|
:profiles {:1.3 {:dependencies [[org.clojure/clojure "1.3.0"]]}
|
||||||
:1.4 {:dependencies [[org.clojure/clojure "1.4.0"]]}
|
:1.4 {:dependencies [[org.clojure/clojure "1.4.0"]]}
|
||||||
:1.5 {:dependencies [[org.clojure/clojure "1.5.0-alpha3"]]}
|
:1.5 {:dependencies [[org.clojure/clojure "1.5.0-alpha3"]]}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@
|
||||||
(:require [taoensso.nippy.utils :as utils])
|
(:require [taoensso.nippy.utils :as utils])
|
||||||
(:import [java.io DataInputStream DataOutputStream ByteArrayOutputStream
|
(:import [java.io DataInputStream DataOutputStream ByteArrayOutputStream
|
||||||
ByteArrayInputStream]
|
ByteArrayInputStream]
|
||||||
[org.xerial.snappy Snappy]
|
|
||||||
[clojure.lang IPersistentList IPersistentVector IPersistentMap
|
[clojure.lang IPersistentList IPersistentVector IPersistentMap
|
||||||
IPersistentSet PersistentQueue IPersistentCollection Keyword
|
IPersistentSet PersistentQueue IPersistentCollection Keyword
|
||||||
BigInt Ratio]))
|
BigInt Ratio]))
|
||||||
|
|
@ -165,7 +164,7 @@
|
||||||
stream (DataOutputStream. ba)]
|
stream (DataOutputStream. ba)]
|
||||||
(freeze-to-stream! stream x print-dup?)
|
(freeze-to-stream! stream x print-dup?)
|
||||||
(let [ba (.toByteArray ba)]
|
(let [ba (.toByteArray ba)]
|
||||||
(if compress? (Snappy/compress ba) ba))))
|
(if compress? (utils/compress-bytes ba) ba))))
|
||||||
|
|
||||||
;;;; Thawing
|
;;;; Thawing
|
||||||
|
|
||||||
|
|
@ -243,7 +242,7 @@
|
||||||
[ba & {:keys [read-eval? compressed?]
|
[ba & {:keys [read-eval? compressed?]
|
||||||
:or {read-eval? false ; For `read-string` injection safety - NB!!!
|
:or {read-eval? false ; For `read-string` injection safety - NB!!!
|
||||||
compressed? true}}]
|
compressed? true}}]
|
||||||
(-> (if compressed? (Snappy/uncompress ba) ba)
|
(-> (if compressed? (utils/uncompress-bytes ba) ba)
|
||||||
(ByteArrayInputStream.)
|
(ByteArrayInputStream.)
|
||||||
(DataInputStream.)
|
(DataInputStream.)
|
||||||
(thaw-from-stream! read-eval?)))
|
(thaw-from-stream! read-eval?)))
|
||||||
|
|
|
||||||
|
|
@ -45,4 +45,10 @@
|
||||||
(let [frozen (reader-freeze data)] (count (.getBytes frozen "UTF8")))
|
(let [frozen (reader-freeze data)] (count (.getBytes frozen "UTF8")))
|
||||||
(let [frozen (freeze-to-bytes data)] (count frozen))
|
(let [frozen (freeze-to-bytes data)] (count frozen))
|
||||||
;; 22788, 12224
|
;; 22788, 12224
|
||||||
|
|
||||||
|
;;; Snappy implementations
|
||||||
|
(println (bench (roundtrip data)))
|
||||||
|
;; No Snappy: 6163 6064 6042 6176
|
||||||
|
;; Snappy JNI: 6489 6446 6542 6412
|
||||||
|
;; Snappy native array copy: 6569 6419 6414 6590
|
||||||
)
|
)
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
(ns taoensso.nippy.utils
|
(ns taoensso.nippy.utils
|
||||||
{:author "Peter Taoussanis"}
|
{:author "Peter Taoussanis"}
|
||||||
(:require [clojure.string :as str]))
|
(:require [clojure.string :as str])
|
||||||
|
(:import org.iq80.snappy.Snappy))
|
||||||
|
|
||||||
(defmacro case-eval
|
(defmacro case-eval
|
||||||
"Like `case` but evaluates test constants for their compile-time value."
|
"Like `case` but evaluates test constants for their compile-time value."
|
||||||
|
|
@ -55,4 +56,15 @@
|
||||||
(defn version-sufficient?
|
(defn version-sufficient?
|
||||||
[version-str min-version-str]
|
[version-str min-version-str]
|
||||||
(try (>= (version-compare version-str min-version-str) 0)
|
(try (>= (version-compare version-str min-version-str) 0)
|
||||||
(catch Exception _ false)))
|
(catch Exception _ false)))
|
||||||
|
|
||||||
|
;; TODO Unnecessarily complicated. Waiting on http://goo.gl/7mbR3 merge.
|
||||||
|
(defn compress-bytes [ba]
|
||||||
|
(let [ba-size (alength ^bytes ba)
|
||||||
|
ba-out (byte-array (Snappy/maxCompressedLength ba-size))
|
||||||
|
ba-out-size (Snappy/compress ba (int 0) (int ba-size) ba-out (int 0))]
|
||||||
|
(java.util.Arrays/copyOf ba-out ba-out-size)))
|
||||||
|
|
||||||
|
(defn uncompress-bytes [ba] (Snappy/uncompress ba 0 (alength ^bytes ba)))
|
||||||
|
|
||||||
|
(comment (String. (uncompress-bytes (compress-bytes (.getBytes "Test")))))
|
||||||
Loading…
Reference in a new issue