Skip to content

Instantly share code, notes, and snippets.

@niwinz
Last active April 4, 2016 11:19
Show Gist options
  • Save niwinz/90e31bef29fef7585188 to your computer and use it in GitHub Desktop.
Save niwinz/90e31bef29fef7585188 to your computer and use it in GitHub Desktop.
Javaslang and Clojure persistent data structures benchmark
#!/usr/bin/env boot
;; BOOT_CLOJURE_NAME=org.clojure/clojure
;; BOOT_CLOJURE_VERSION=1.8.0
;; BOOT_VERSION=2.5.5
;; BOOT_JVM_OPTIONS="-Xms4g -Xmx4g -XX:+UseG1GC -XX:+AggressiveOpts -server"
(set-env! :dependencies '[[criterium "0.4.4"]
[io.javaslang/javaslang "2.0.2"]])
(import 'javaslang.collection.HashMap)
(import 'javaslang.collection.HashSet)
(import 'javaslang.collection.Vector)
(import 'javaslang.collection.List)
(import 'clojure.lang.PersistentHashMap)
(import 'clojure.lang.PersistentHashSet)
(import 'clojure.lang.PersistentVector)
(import 'clojure.lang.PersistentList)
(import 'clojure.lang.IPersistentList)
(require '[criterium.core :refer [bench quick-bench with-progress-reporting]])
(def keypairs-1000
(mapv #(vector (keyword (str "foo-" (mod % 18))) (mod % 28))
(range 10000)))
(defn bench-javaslang-hashmap
[]
(let [init (HashMap/empty)]
(reduce (fn [st [k v]] (.put ^HashMap st k v))
init keypairs-1000)))
(defn bench-clojure-hashmap
[]
(let [init (PersistentHashMap/EMPTY)]
(reduce (fn [st [k v]] (.assoc ^PersistentHashMap st k v))
init keypairs-1000)))
(defn bench-javaslang-hashset
[]
(let [init (HashSet/empty)]
(reduce (fn [st [k v]] (.add ^HashSet st k))
init keypairs-1000)))
(defn bench-clojure-hashset
[]
(let [init (PersistentHashSet/EMPTY)]
(reduce (fn [st [k v]] (.cons ^PersistentHashSet st k))
init keypairs-1000)))
(defn bench-javaslang-vector
[]
(let [init (Vector/empty)]
(reduce (fn [st v] (.append ^Vector st v))
init keypairs-1000)))
(defn bench-clojure-vector
[]
(let [init (PersistentVector/EMPTY)]
(reduce (fn [st v] (.cons ^PersistentVector st v))
init keypairs-1000)))
(defn bench-javaslang-list
[]
(let [init (List/empty)]
(reduce (fn [st v] (.prepend ^List st v))
init keypairs-1000)))
(defn bench-clojure-list
[]
(let [init (PersistentList/EMPTY)]
(reduce (fn [st v] (.cons ^IPersistentList st v))
init keypairs-1000)))
(defn -main
[& args]
(println "\njavaslang:hashmap")
(with-progress-reporting
(quick-bench (bench-javaslang-hashmap) :verbose))
(println "\nclojure:hashmap")
(with-progress-reporting
(quick-bench (bench-clojure-hashmap) :verbose))
(println "\nclojure:hashset")
(with-progress-reporting
(quick-bench (bench-clojure-hashset) :verbose))
(println "\njavaslang:hashset")
(with-progress-reporting
(quick-bench (bench-javaslang-hashset) :verbose))
(println "\njavaslang:vector")
(with-progress-reporting
(quick-bench (bench-javaslang-vector) :verbose))
(println "\nclojure:vector")
(with-progress-reporting
(quick-bench (bench-clojure-vector) :verbose))
(println "\njavaslang:list")
(with-progress-reporting
(quick-bench (bench-javaslang-list) :verbose))
(println "\nclojure:list")
(with-progress-reporting
(quick-bench (bench-clojure-list) :verbose))
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment