|
(ns bench |
|
(:require [criterium.core :as cr])) |
|
|
|
(defn first' [xform coll] |
|
(transduce xform (completing (fn [_ x] (reduced x))) nil coll)) |
|
|
|
(defn range-bench [n] |
|
(let [m (* 2 n)] |
|
(printf "# range (%d) - first\n" n) |
|
(cr/quick-bench (first (filter #(>= % n) (range m)))) |
|
(newline) |
|
(printf "# range (%d) - first'\n" n) |
|
(cr/quick-bench (first' (filter #(>= % n)) (range m))) |
|
(newline))) |
|
|
|
(defn iterate-bench [n] |
|
(printf "# iterate (%d) - first\n" n) |
|
(cr/quick-bench (first (filter #(>= % n) (iterate inc 0)))) |
|
(newline) |
|
(printf "# iterate (%d) - first'\n" n) |
|
(cr/quick-bench (first' (filter #(>= % n)) (iterate inc 0))) |
|
(newline)) |
|
|
|
(defn vector-bench [n] |
|
(let [m (* 2 n) |
|
xs (vec (range m))] |
|
(printf "# vector (%d) - first\n" n) |
|
(cr/quick-bench (first (filter #(>= % n) xs))) |
|
(newline) |
|
(printf "# vector (%d) - first'\n" n) |
|
(cr/quick-bench (first' (filter #(>= % n)) xs)) |
|
(newline))) |
|
|
|
(defn chunked-seq-bench [n] |
|
(let [m (* 2 n)] |
|
(printf "# chunked seq (%d) - first\n" n) |
|
(cr/quick-bench (first (filter #(>= % n) (map identity (range m))))) |
|
(newline) |
|
(printf "# chunked seq (%d) - first'\n" n) |
|
(cr/quick-bench (first' (filter #(>= % n)) (map identity (range m)))) |
|
(newline))) |
|
|
|
(defn lazy-range [n] |
|
(letfn [(step [i] |
|
(if (< i n) |
|
(cons i (lazy-seq (step (inc i)))) |
|
()))] |
|
(step 0))) |
|
|
|
(defn lazy-seq-bench [n] |
|
(let [m (* 2 n)] |
|
(printf "# lazy seq (%d) - first\n" n) |
|
(cr/quick-bench (first (filter #(>= % n) (lazy-range m)))) |
|
(newline) |
|
(printf "# lazy seq (%d) - first'\n" n) |
|
(cr/quick-bench (first' (filter #(>= % n)) (lazy-range m))) |
|
(newline))) |
|
|
|
(defn iterable-bench [n] |
|
(let [m (* 2 n) |
|
xs (java.util.List/of (object-array (range m)))] |
|
(printf "# iterable (%d) - first\n" n) |
|
(cr/quick-bench (first (filter #(>= % n) xs))) |
|
(newline) |
|
(printf "# iterable (%d) - first'\n" n) |
|
(cr/quick-bench (first' (filter #(>= % n)) xs)) |
|
(newline))) |
|
|
|
(defn array-seq-bench [n] |
|
(let [m (* 2 n) |
|
xs (object-array (range m))] |
|
(printf "# array seq (%d) - first\n" n) |
|
(cr/quick-bench (first (filter #(>= % n) (seq xs)))) |
|
(newline) |
|
(printf "# array seq (%d) - first'\n" n) |
|
(cr/quick-bench (first' (filter #(>= % n)) (seq xs))) |
|
(newline))) |
|
|
|
(defn -main [] |
|
(doseq [f [range-bench |
|
iterate-bench |
|
vector-bench |
|
chunked-seq-bench |
|
lazy-seq-bench |
|
iterable-bench |
|
array-seq-bench]] |
|
(run! f [10 20 50 100 200 500 1000 2000 5000 10000]))) |