Skip to content

Instantly share code, notes, and snippets.

@joinr
Last active November 30, 2022 06:49
Show Gist options
  • Save joinr/204e556ab04546265a16d1949f213817 to your computer and use it in GitHub Desktop.
Save joinr/204e556ab04546265a16d1949f213817 to your computer and use it in GitHub Desktop.
clone bench
(defn clone-assoc [obj k v]
(let [m (Object.assign #js{} obj)]
(aset m k v)
m))
;;cljs.user> (def origin #js{"x" 1})
;;#'cljs.user/origin
;;cljs.user> (clone-assoc origin "x" 2)
;;#js {:x 2}
;;cljs.user> origin
;;#js {:x 1}
(defn bench-them! [n & {:keys [reps] :or {reps 10000}}]
(let [m (zipmap (map str (range n)) (range n))
obj (clj->js m)]
(println [:size n])
(simple-benchmark []
(do (assoc m "100" -1) nil) reps)
(simple-benchmark []
(do (clone-assoc obj "100" -1) nil) reps)))
(defn sample! []
(doseq [i (concat (range 1 21) (range 20 100 20) [200 300 400 500])]
(bench-them! i)))
(defn results->records [xs]
(for [[[_ size]
_ _ _ _ ares _
_ _ _ _ cloneres _] (partition 13 xs)]
{"size" size "assoc(ms)" ares "clone(ms)" cloneres}))
(defn records->table [xs]
(let [headers (keys (first xs))]
(println (str "|" (clojure.string/join "|" headers) "|"))
(println (clojure.string/join "|" (repeat (count headers) ":--")))
(doseq [x xs]
(println (str "|" (clojure.string/join "|" (vals x) ) "|")))))
;;from browser repl in firefox.
;; cljs.user> (sample!)
;; [:size 1]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 4 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 4 msecs
;; [:size 2]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 2 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 4 msecs
;; [:size 3]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 2 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 6 msecs
;; [:size 4]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 1 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 5 msecs
;; [:size 5]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 3 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 6 msecs
;; [:size 6]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 3 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 6 msecs
;; [:size 7]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 3 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 8 msecs
;; [:size 8]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 47 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 8 msecs
;; [:size 9]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 8 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 8 msecs
;; [:size 10]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 9 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 9 msecs
;; [:size 11]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 9 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 9 msecs
;; [:size 12]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 9 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 11 msecs
;; [:size 13]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 8 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 11 msecs
;; [:size 14]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 8 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 10 msecs
;; [:size 15]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 9 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 13 msecs
;; [:size 16]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 9 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 12 msecs
;; [:size 17]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 9 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 15 msecs
;; [:size 18]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 8 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 14 msecs
;; [:size 19]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 8 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 16 msecs
;; [:size 20]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 9 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 16 msecs
;; [:size 20]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 9 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 16 msecs
;; [:size 40]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 6 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 28 msecs
;; [:size 60]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 7 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 40 msecs
;; [:size 80]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 8 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 51 msecs
;; [:size 200]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 9 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 124 msecs
;; [:size 300]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 9 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 274 msecs
;; [:size 400]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 10 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 345 msecs
;; [:size 500]
;; [], (do (assoc m "100" -1) nil), 10000 runs, 10 msecs
;; [], (do (clone-assoc obj "100" -1) nil), 10000 runs, 456 msecs
;;copied results into quoted vector, then
;;cljs.user> (-> results results->records records->table)
;;to get the formatted output.
|size|assoc(ms)|clone(ms)|
:--|:--|:--
|1|4|4|
|2|2|4|
|3|2|6|
|4|1|5|
|5|3|6|
|6|3|6|
|7|3|8|
|8|47|8|
|9|8|8|
|10|9|9|
|11|9|9|
|12|9|11|
|13|8|11|
|14|8|10|
|15|9|13|
|16|9|12|
|17|9|15|
|18|8|14|
|19|8|16|
|20|9|16|
|20|9|16|
|40|6|28|
|60|7|40|
|80|8|51|
|200|9|124|
|300|9|274|
|400|10|345|
|500|10|456|
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment