From a84ca07c8214c69323d66858ea2ade70b3c4721d Mon Sep 17 00:00:00 2001 From: Leif Date: Tue, 10 Oct 2017 16:14:06 -0700 Subject: [PATCH 1/2] Eliminate seq overhead for unpack-n / unpack-map --- src/msgpack/core.clj | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/msgpack/core.clj b/src/msgpack/core.clj index f1cf3dc..fa6f286 100644 --- a/src/msgpack/core.clj +++ b/src/msgpack/core.clj @@ -277,10 +277,24 @@ (->Ext (.readByte data-input) (read-bytes n data-input)))) (defn- unpack-n [n ^DataInput data-input opts] - (doall (for [_ (range n)] (unpack-stream data-input opts)))) + (loop [i 0 + v (transient [])] + (if (< i n) + (recur + (inc i) + (conj! v (unpack-stream data-input opts))) + (persistent! v)))) (defn- unpack-map [n ^DataInput data-input opts] - (apply hash-map (unpack-n (* 2 n) data-input opts))) + (loop [i 0 + m (transient {})] + (if (< i n) + (recur + (inc i) + (assoc! m + (unpack-stream data-input opts) + (unpack-stream data-input opts))) + (persistent! m)))) (defn unpack-stream ([^DataInput data-input] (unpack-stream data-input nil)) From 7767510adeb2d095e52fff675eaa8450381f5263 Mon Sep 17 00:00:00 2001 From: Leif Date: Tue, 10 Oct 2017 16:22:07 -0700 Subject: [PATCH 2/2] Use unchecked-inc to eliminate boxed counter --- src/msgpack/core.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/msgpack/core.clj b/src/msgpack/core.clj index fa6f286..f188a79 100644 --- a/src/msgpack/core.clj +++ b/src/msgpack/core.clj @@ -281,7 +281,7 @@ v (transient [])] (if (< i n) (recur - (inc i) + (unchecked-inc i) (conj! v (unpack-stream data-input opts))) (persistent! v)))) @@ -290,7 +290,7 @@ m (transient {})] (if (< i n) (recur - (inc i) + (unchecked-inc i) (assoc! m (unpack-stream data-input opts) (unpack-stream data-input opts)))