From d327f0ff38c755e2df2ad2a183e127cd1cc3c1c8 Mon Sep 17 00:00:00 2001 From: Peter Taoussanis Date: Tue, 8 Mar 2016 11:13:46 +0700 Subject: [PATCH] Types: add dedicated 2 and 3 tuple type --- project.clj | 2 +- src/taoensso/nippy.clj | 24 +++++++++++++++++++++--- src/taoensso/nippy/benchmarks.clj | 11 +++++++++-- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/project.clj b/project.clj index 5cf7deb..dcd085c 100644 --- a/project.clj +++ b/project.clj @@ -15,7 +15,7 @@ :dependencies [[org.clojure/clojure "1.5.1"] [org.clojure/tools.reader "0.10.0"] - [com.taoensso/encore "2.41.0"] + [com.taoensso/encore "2.42.0"] [org.iq80.snappy/snappy "0.4"] [org.tukaani/xz "1.5"] [net.jpountz.lz4/lz4 "1.3"]] diff --git a/src/taoensso/nippy.clj b/src/taoensso/nippy.clj index b6404e7..d02c199 100644 --- a/src/taoensso/nippy.clj +++ b/src/taoensso/nippy.clj @@ -124,7 +124,8 @@ (def ^:const id-sm-set (byte 111)) ; '' (def ^:const id-sm-map (byte 112)) ; '' ;; - ;; TODO Additional optimizations (types) for 2-vecs and 3-vecs? + (def ^:const id-2-vec (byte 113)) + (def ^:const id-3-vec (byte 114)) ;;; DEPRECATED (old types will be supported only for thawing) (def ^:const id-reader-depr1 (byte 1)) ; v0.9.2+ for +64k support @@ -262,9 +263,22 @@ (freeze-to-out! out v)) coll))) -(defn write-ided-vec [out v] (write-ided-coll out id-sm-vec id-vec v)) +;; (defn write-ided-vec [out v] (write-ided-coll out id-sm-vec id-vec v)) (defn write-ided-set [out s] (write-ided-coll out id-sm-set id-set s)) (defn write-ided-map [out m] (write-ided-kvs out id-sm-map id-map m)) +(defn write-ided-vec [^DataOutput out v] + (let [cnt (count v)] + (cond + (== cnt 2) (write-id out id-2-vec) + (== cnt 3) (write-id out id-3-vec) + (byte-sized? cnt) + (do (write-id out id-sm-vec) + (.writeByte out cnt)) + :else + (do (write-id out id-vec) + (.writeInt out cnt))) + + (enc/run!* (fn [in] (freeze-to-out! out in)) v))) (defmacro ^:private freezer* [type & body] `(extend-type ~type @@ -290,7 +304,7 @@ (freezer* PersistentTreeSet (write-ided-coll out nil id-sorted-set x)) (freezer* PersistentTreeMap (write-ided-kvs out nil id-sorted-map x)) (freezer* APersistentMap (write-ided-kvs out id-sm-map id-map x)) -(freezer* APersistentVector (write-ided-coll out id-sm-vec id-vec x)) +(freezer* APersistentVector (write-ided-vec out x)) (freezer* APersistentSet (write-ided-coll out id-sm-set id-set x)) ;; No APersistentList: @@ -581,6 +595,10 @@ id-vec (read-coll in []) id-sm-vec (read-sm-coll in []) + id-2-vec [(thaw-from-in! in) (thaw-from-in! in)] + id-3-vec [(thaw-from-in! in) (thaw-from-in! in) + (thaw-from-in! in)] + id-set (read-coll in #{}) id-sm-set (read-sm-coll in #{}) id-map (read-kvs in {}) diff --git a/src/taoensso/nippy/benchmarks.clj b/src/taoensso/nippy/benchmarks.clj index 50e81f9..44a9538 100644 --- a/src/taoensso/nippy/benchmarks.clj +++ b/src/taoensso/nippy/benchmarks.clj @@ -68,8 +68,15 @@ (set! *unchecked-math* false) ;; (bench {:reader? true :lzma2? true :fressian? true :laps 3}) ;; (bench {:laps 4}) - ;; (bench {:laps 2 :lzma2? true}) - ;; (bench {:laps 2}) + + ;;; 2016 Mar 8, v2.12.0-SNAPSHOT, new hardware + {:reader {:round 51217, :freeze 16729, :thaw 34488, :size 27698}} + {:lzma2 {:round 42066, :freeze 27249, :thaw 14817, :size 11232}} + {:fressian {:round 6594, :freeze 4789, :thaw 1805, :size 16985}} + {:encrypted {:round 4664, :freeze 2856, :thaw 1808, :size 16132}} + {:default {:round 4127, :freeze 2546, :thaw 1581, :size 16113}} + {:fast1 {:round 3541, :freeze 2024, :thaw 1517, :size 16975}} + {:fast2 {:round 3497, :freeze 2018, :thaw 1479, :size 16971}} ;;; 2015 Oct 6, v2.11.0-alpha4 {:reader {:round 73409, :freeze 21823, :thaw 51586, :size 27672}}