Skip to content

Instantly share code, notes, and snippets.

@joinr
Created October 15, 2020 08:43
Show Gist options
  • Save joinr/fa5e1211b24e976797ad1e8c5435b862 to your computer and use it in GitHub Desktop.
Save joinr/fa5e1211b24e976797ad1e8c5435b862 to your computer and use it in GitHub Desktop.
transient microbench
(require '[criterium.core :as c])
(c/quick-bench
(reduce (fn [acc k] (assoc acc k k)) {} (range 10000)))
;;Execution time mean : 1.682198 ms
(c/quick-bench
(persistent!
(reduce (fn [acc k] (assoc! acc k k)) (transient {}) (range 10000))))
;;Execution time mean : 1.131668 ms
(c/quick-bench
(reduce (fn [acc k] (assoc acc k k)) {} (range 100000)))
;;Execution time mean : 26.762277 ms
(c/quick-bench
(persistent!
(reduce (fn [acc k] (assoc! acc k k)) (transient {}) (range 100000))))
;;Execution time mean : 16.329220 ms
(c/quick-bench
(reduce (fn [acc k] (assoc acc k k)) {} (range 1000000)))
;;Execution time mean : 430.660649 ms
(c/quick-bench
(persistent!
(reduce (fn [acc k] (assoc! acc k k)) (transient {}) (range 1000000))))
;;Execution time mean : 366.550349 ms
(c/quick-bench
(reduce (fn [acc k] (.put ^java.util.Map acc k k) acc)
(java.util.HashMap.) (range 1000000 )))
;;Execution time mean : 20.596182 ms
;;what about random updates?
(def ^:const +n+ 100000)
(def ^:const +half+ 50000)
(let [m (into {} (map-indexed vector) (range +n+))]
(c/quick-bench (assoc m (rand-int +n+) :wumpus!)))
;; Execution time mean : 266.766551 ns
(let [m (atom (transient (into {} (map-indexed vector) (range +n+))))]
(c/quick-bench (swap! m #(assoc! % (rand-int +n+) :wumpus!))))
;;Execution time mean : 200.067617 ns
(deftype container [^:unsynchronized-mutable ^clojure.lang.ITransientMap tm]
clojure.lang.ITransientMap
(assoc [this k v]
(set! tm (assoc! tm k v)))
(persistent [this] (persistent! tm))
clojure.lang.IFn
(invoke [this k]
(.invoke ^clojure.lang.IFn tm k))
(invoke [this k not-found]
(.invoke ^clojure.lang.IFn tm k not-found)))
(let [m (container. (transient (into {} (map-indexed vector) (range +n+))))]
(c/quick-bench (assoc! m (rand-int +n+) :wumpus!)))
;;Execution time mean : 180.938955 ns
(let [^java.util.HashMap m (java.util.HashMap.)
_ (dotimes [i +n+] (.put m i i))]
(c/quick-bench (.put m (rand-int +n+) :wumpus!)))
;;Execution time mean : 190.220829 ns
(let [m (into {} (map-indexed vector) (range +n+))]
(c/quick-bench (m (rand-int +n+))))
;;Execution time mean : 182.733824 ns
(let [m (container. (transient (into {} (map-indexed vector) (range +n+))))]
(c/quick-bench (m (rand-int +n+))))
;;Execution time mean : 180.938955 ns
(let [^java.util.HashMap m (java.util.HashMap.)
_ (dotimes [i +n+] (.put m i i))]
(c/quick-bench (.get m (rand-int +n+))))
;;Execution time mean : 106.210251 ns
;;fixed index, no rand-int...
(let [m (into {} (map-indexed vector) (range +n+))]
(c/quick-bench (assoc m +half+ :wumpus!)))
;; Execution time mean : 127.429106 ns
(let [m (atom (transient (into {} (map-indexed vector) (range +n+))))]
(c/quick-bench (swap! m #(assoc! % +half+ :wumpus!))))
;;Execution time mean : 75.395346 ns
(let [m (container. (transient (into {} (map-indexed vector) (range +n+))))]
(c/quick-bench (assoc! m +half+ :wumpus!)))
;;Execution time mean : 70.717501 ns
(let [^java.util.HashMap m (java.util.HashMap.)
_ (dotimes [i +n+] (.put m i i))]
(c/quick-bench (.put m +half+ :wumpus!)))
;;Execution time mean : 6.742238 ns
(let [m (into {} (map-indexed vector) (range +n+))]
(c/quick-bench (m +half+)))
;;Execution time mean : 70.656638 ns
(let [m (container. (transient (into {} (map-indexed vector) (range +n+))))]
(c/quick-bench (m +half+)))
;;Execution time mean : 61.775912 ns
(let [^java.util.HashMap m (java.util.HashMap.)
_ (dotimes [i +n+] (.put m i i))]
(c/quick-bench (.get m +half+)))
;;Execution time mean : 5.836025 ns
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment