From 4778500e0370fb211f47ebf4d69ca64366117b6c Mon Sep 17 00:00:00 2001 From: Nathan Marz Date: Wed, 15 Jun 2016 12:23:03 -0400 Subject: [PATCH] more benchmarks for map-vals --- scripts/benchmarks.clj | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/scripts/benchmarks.clj b/scripts/benchmarks.clj index e74a46b..8d60eca 100644 --- a/scripts/benchmarks.clj +++ b/scripts/benchmarks.clj @@ -84,6 +84,31 @@ (manual-transform data inc) )) +(defn map-vals-map-iterable [^clojure.lang.IMapIterable m afn] + (let [k-it (.keyIterator m) + v-it (.valIterator m)] + (loop [ret {}] + (if (.hasNext k-it) + (let [k (.next k-it) + v (.next v-it)] + (recur (assoc ret k (afn v))) + ) + ret + )))) + +(defn map-vals-map-iterable-transient [^clojure.lang.IMapIterable m afn] + (persistent! + (let [k-it (.keyIterator m) + v-it (.valIterator m)] + (loop [ret (transient {})] + (if (.hasNext k-it) + (let [k (.next k-it) + v (.next v-it)] + (recur (assoc! ret k (afn v))) + ) + ret + ))))) + (let [data {:a 1 :b 2 :c 3 :d 4}] (run-benchmark "transform values of a small map" 1000000 (into {} (for [[k v] data] [k (inc v)])) @@ -93,6 +118,9 @@ (transform [ALL LAST] inc data) (transform MAP-VALS inc data) (zipmap (keys data) (map inc (vals data))) + (into {} (map (fn [e] [(key e) (inc (val e))]) data)) + (map-vals-map-iterable data inc) + (map-vals-map-iterable-transient data inc) )) (let [data (->> (for [i (range 1000)] [i i]) (into {}))] @@ -100,10 +128,14 @@ (into {} (for [[k v] data] [k (inc v)])) (reduce-kv (fn [m k v] (assoc m k (inc v))) {} data) (persistent! (reduce-kv (fn [m k v] (assoc! m k (inc v))) (transient {}) data)) + (persistent! (reduce-kv (fn [m k v] (assoc! m k (inc v))) (transient clojure.lang.PersistentHashMap/EMPTY) data)) (reduce-kv (fn [m k v] (assoc m k (inc v))) (empty data) data) (transform [ALL LAST] inc data) (transform MAP-VALS inc data) (zipmap (keys data) (map inc (vals data))) + (into {} (map (fn [e] [(key e) (inc (val e))]) data)) + (map-vals-map-iterable data inc) + (map-vals-map-iterable-transient data inc) )) (let [data [1 2 3 4 5]]