Created
October 15, 2020 08:43
-
-
Save joinr/fa5e1211b24e976797ad1e8c5435b862 to your computer and use it in GitHub Desktop.
transient microbench
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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