diff --git a/scripts/benchmarks.clj b/scripts/benchmarks.clj index 0516f52..61aa268 100644 --- a/scripts/benchmarks.clj +++ b/scripts/benchmarks.clj @@ -1,6 +1,7 @@ (ns com.rpl.specter.benchmarks (:use [com.rpl.specter] [com.rpl.specter macros] + [com.rpl.specter.transient] [com.rpl.specter.impl :only [benchmark]]) (:require [clojure.walk :as walk])) @@ -141,3 +142,46 @@ (tree-value-transform (fn [e] (if (even? e) (inc e) e)) data) )) +(run-benchmark "transient comparison: building up vectors" + 6 + 10000 + (reduce (fn [v i] (conj v i)) [] (range 1000)) + (reduce (fn [v i] (conj! v i)) (transient []) (range 1000)) + ;; uncomment this when END is fast + #_(reduce (fn [v i] (setval [END] [i] v)) [] (range 1000)) + (setval [END!] (range 1000) (transient [])) + (reduce (fn [v i] (setval [END!] [i] v)) (transient []) (range 1000))) + +(let [data (vec (range 1000)) + tdata (transient data)] + (run-benchmark "transient comparison: assoc'ing in vectors" + 6 + 500000 + (assoc data (rand-int 1000) 0) + (assoc! tdata (rand-int 1000) 0) + (setval [(keypath (rand-int 1000))] 0 data) + (setval [(keypath! (rand-int 1000))] 0 tdata))) + +(let [data (into {} (for [k (range 1000)] + [k (rand)])) + tdata (transient data)] + (run-benchmark "transient comparison: assoc'ing in maps" + 6 + 500000 + (assoc data (rand-int 1000) 0) + (assoc! tdata (rand-int 1000) 0) + (setval [(keypath (rand-int 1000))] 0 data) + (setval [(keypath! (rand-int 1000))] 0 tdata))) + +(defn modify-submap + [m] + (assoc m 0 1 458 89)) + +(let [data (into {} (for [k (range 1000)] + [k (rand)])) + tdata (transient data)] + (run-benchmark "transient comparison: submap" + 6 + 300000 + (transform [(submap [(rand-int 1000)])] modify-submap data) + (transform [(submap! [(rand-int 1000)])] modify-submap tdata)))