Last active
April 4, 2016 11:19
-
-
Save niwinz/90e31bef29fef7585188 to your computer and use it in GitHub Desktop.
Javaslang and Clojure persistent data structures benchmark
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
#!/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