Add benchmarks to test transient navigators

This commit is contained in:
Alex Engelberg 2016-06-07 23:16:23 -07:00
parent 399e5661f1
commit bafe10036f

View file

@ -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)))