|
18 | 18 | [taoensso.encore :as enc] |
19 | 19 |
|
20 | 20 | ;; :cljs cannot compile taoensso.sente under :nodejs target |
21 | | - #?(:clj [taoensso.sente :as sente]) |
| 21 | + #?(:clj [taoensso.sente :as sente]) |
22 | 22 |
|
23 | 23 | [taoensso.sente.interfaces :as i] |
24 | 24 | [taoensso.sente.packers.edn :as ep] |
25 | 25 | [taoensso.sente.packers.transit :as tp] |
26 | | - [taoensso.sente.packers.msgpack :as mp]) |
27 | | - |
28 | | - #?(:cljs |
29 | | - (:require-macros |
30 | | - [taoensso.sente-tests :refer [get-bench-data]]))) |
| 26 | + [taoensso.sente.packers.msgpack :as mp] |
| 27 | + [taoensso.sente.packers.gzip :as gz])) |
31 | 28 |
|
32 | 29 | (comment |
33 | 30 | (remove-ns 'taoensso.sente-tests) |
34 | 31 | (test/run-tests 'taoensso.sente-tests)) |
35 | 32 |
|
36 | 33 | ;;;; |
37 | 34 |
|
38 | | -(defn get-bench-data [] |
| 35 | +(def ^:const timeout-msecs 16000) |
| 36 | +(def ^:const bench-laps 1e2) |
| 37 | + |
| 38 | +;;;; Test data |
| 39 | + |
| 40 | +(defn get-test-data [] |
39 | 41 | #_{:a :A :b :B :c "foo", :v (vec (range 128)), :s (set (range 128))} |
40 | 42 | {:ids (vec (repeatedly 1024 (fn [] (rand-int 32767)))) |
41 | 43 | :data |
|
54 | 56 | :warnings nil |
55 | 57 | :a-simple-string (enc/uuid-str 16) |
56 | 58 | :a-double-number (rand 32767) |
57 | | - :a-boolean-i-think-cant-recall nil |
| 59 | + :a-boolean (rand-nth [true false]) |
58 | 60 | :archive-date nil |
59 | 61 | :another-number (rand-int 32767) |
60 | 62 | :internal-notes nil |
|
63 | 65 | :submit-date (str (enc/now-inst)) |
64 | 66 | :display-name (enc/uuid-str) |
65 | 67 | :user nil |
| 68 | + :uuid (random-uuid) |
66 | 69 | :a-vector-of-integers (vec (repeatedly 64 (fn [] (rand-int 128)))) |
67 | 70 | :children-count (rand-int 1024) |
68 | 71 | :a-usually-absent-string nil})))}) |
69 | 72 |
|
70 | | -(defn packed-len [x] |
71 | | - #?(:cljs (if (instance? js/Uint8Array x) (.-length x) (count x)) |
72 | | - :clj (count x))) |
73 | | - |
74 | | -(defn bench1 [packer laps data] |
75 | | - {:time (enc/qb laps (i/pack packer nil data (fn [x] (i/unpack packer nil (get x :value) (fn [y] (get y :value)))))) |
76 | | - :size (packed-len (i/pack packer nil data (fn [x] (get x :value))))}) |
77 | | - |
78 | | -(deftest bench-packers |
79 | | - (let [laps 1e2 |
80 | | - bd (get-bench-data) |
81 | | - ep (ep/get-packer) |
82 | | - tp (tp/get-packer) |
83 | | - mp (mp/get-packer)] |
84 | | - |
85 | | - (println "Benching comparison:" |
86 | | - {:ep (bench1 ep laps bd) |
87 | | - :tp (bench1 tp laps bd) |
88 | | - :mp (bench1 mp laps bd)}))) |
| 73 | +(def td1 (get-test-data)) |
| 74 | +(def td2 (get-test-data)) |
| 75 | + |
| 76 | +;;;; Packers |
| 77 | + |
| 78 | +(defn roundtrip |
| 79 | + "Returns Clj/s promise." |
| 80 | + ([data packer cb-fn] |
| 81 | + (i/pack packer nil data |
| 82 | + (fn [packed] |
| 83 | + (i/unpack packer nil (get packed :value) |
| 84 | + (fn [unpacked] (cb-fn (get unpacked :value))))))) |
| 85 | + |
| 86 | + ([data packer] |
| 87 | + #?(:clj (let [p (promise)] (roundtrip data packer (fn [v] (deliver p v))) p) |
| 88 | + :cljs (js/Promise. (fn [resolve _reject] (roundtrip data packer (fn [v] (resolve v)))))))) |
| 89 | + |
| 90 | +(comment @(roundtrip :data (ep/get-packer))) |
| 91 | + |
| 92 | +(defn test-promise [p f] ; f is test-fn |
| 93 | + #?(:clj (f (deref p timeout-msecs :timeout)) |
| 94 | + :cljs |
| 95 | + (test/async done |
| 96 | + (let [done (let [run?_ (atom false)] (fn [] (when (compare-and-set! run?_ false true) (done)))) |
| 97 | + timer (js/setTimeout #(do (f :timeout) (done)) timeout-msecs)] |
| 98 | + (-> p |
| 99 | + (.then (fn [v] (js/clearTimeout timer) (f v))) |
| 100 | + (.catch (fn [e] (js/clearTimeout timer) (f e))) |
| 101 | + (.finally (fn [ ] (js/clearTimeout timer) (done)))))))) |
| 102 | + |
| 103 | +(do |
| 104 | + (deftest test-packer-edn (test-promise (roundtrip td1 (ep/get-packer)) #(is (= td1 %)))) |
| 105 | + (deftest test-packer-transit (test-promise (roundtrip td1 (tp/get-packer)) #(is (= td1 %)))) |
| 106 | + (deftest test-packer-msgpack (test-promise (roundtrip td1 (mp/get-packer)) #(is (= td1 %)))) |
| 107 | + (deftest test-packer-gz+edn (test-promise (roundtrip td1 (gz/wrap-packer (ep/get-packer) {:binary? false})) #(is (= td1 %)))) |
| 108 | + (deftest test-packer-gz+transit (test-promise (roundtrip td1 (gz/wrap-packer (tp/get-packer) {:binary? false})) #(is (= td1 %)))) |
| 109 | + (deftest test-packer-gz+msgpack (test-promise (roundtrip td1 (gz/wrap-packer (mp/get-packer) {:binary? true})) #(is (= td1 %))))) |
| 110 | + |
| 111 | +;;;; Benching |
| 112 | + |
| 113 | +(defn packed-len [x] #?(:clj (count x), :cljs (if (instance? js/Uint8Array x) (.-length x) (count x)))) |
| 114 | + |
| 115 | +(defn bench1 |
| 116 | + "Returns Clj/s promise." |
| 117 | + [data packer] |
| 118 | + #?(:clj |
| 119 | + (let [size (let [p (promise)] (i/pack packer nil data #(deliver p (packed-len (get % :value)))) (deref p timeout-msecs -1)) |
| 120 | + t0 (enc/now-nano)] |
| 121 | + |
| 122 | + (dotimes [_ bench-laps] (deref (roundtrip data packer) timeout-msecs :timeout)) |
| 123 | + (let [msecs (enc/round (/ (- (enc/now-nano) t0) 1e6))] |
| 124 | + (deliver (promise) {:size size, :msecs msecs}))) |
| 125 | + |
| 126 | + :cljs |
| 127 | + (-> |
| 128 | + (js/Promise. (fn [resolve _] (i/pack packer nil data #(resolve (get % :value))))) |
| 129 | + (.then |
| 130 | + (fn [packed] |
| 131 | + (let [size (packed-len packed) |
| 132 | + t0 (enc/now-nano) |
| 133 | + step |
| 134 | + (fn step [i] |
| 135 | + (if (< i bench-laps) |
| 136 | + (-> (roundtrip data packer) (.then (fn [_] (step (inc i))))) |
| 137 | + (let [msecs (enc/round (/ (- (enc/now-nano) t0) 1e6))] |
| 138 | + (js/Promise.resolve {:size size, :msecs msecs}))))] |
| 139 | + (step 0))))))) |
| 140 | + |
| 141 | +(def benched_ (atom {})) |
| 142 | +(defn >benched [id] (fn [val] (swap! benched_ assoc id val))) |
| 143 | + |
| 144 | +(test/use-fixtures :once |
| 145 | + (taoensso.encore/test-fixtures |
| 146 | + {:after |
| 147 | + (fn [] |
| 148 | + (println "Benchmarks:") |
| 149 | + (doseq [[id results] (sort @benched_)] |
| 150 | + (println (str id ": " results))))})) |
| 151 | + |
| 152 | +(do |
| 153 | + (deftest bench-packer-edn (test-promise (bench1 td1 (ep/get-packer)) (>benched :edn))) |
| 154 | + (deftest bench-packer-transit (test-promise (bench1 td1 (tp/get-packer)) (>benched :transit))) |
| 155 | + (deftest bench-packer-msgpack (test-promise (bench1 td1 (mp/get-packer)) (>benched :msgpack))) |
| 156 | + (deftest bench-packer-gz+edn (test-promise (bench1 td1 (gz/wrap-packer (ep/get-packer) {:binary? false})) (>benched :edn+gz))) |
| 157 | + (deftest bench-packer-gz+transit (test-promise (bench1 td1 (gz/wrap-packer (tp/get-packer) {:binary? false})) (>benched :transit+gz))) |
| 158 | + (deftest bench-packer-gz+msgpack (test-promise (bench1 td1 (gz/wrap-packer (mp/get-packer) {:binary? true})) (>benched :msgpack+gz)))) |
89 | 159 |
|
90 | 160 | ;;;; |
91 | 161 |
|
|
0 commit comments