|
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 |
42 | 44 | (vec |
43 | 45 | (repeatedly 128 |
44 | 46 | (fn [] |
45 | | - {:children-types [(enc/uuid-str 8) (enc/uuid-str 8) (enc/uuid-str 8)] |
46 | | - :description "" |
47 | | - :tips nil |
48 | | - :a-url-in-text nil |
49 | | - :name (enc/uuid-str) |
50 | | - :parents-ids nil |
51 | | - :type-id 1 |
52 | | - :experimental false |
53 | | - :duration 61 |
54 | | - :warnings nil |
55 | | - :a-simple-string (enc/uuid-str 16) |
56 | | - :a-double-number (rand 32767) |
57 | | - :a-boolean-i-think-cant-recall nil |
58 | | - :archive-date nil |
59 | | - :another-number (rand-int 32767) |
60 | | - :internal-notes nil |
61 | | - :id (rand-int 32767) |
62 | | - :a-boolean false |
63 | | - :submit-date (str (enc/now-inst)) |
64 | | - :display-name (enc/uuid-str) |
65 | | - :user nil |
66 | | - :a-vector-of-integers (vec (repeatedly 64 (fn [] (rand-int 128)))) |
67 | | - :children-count (rand-int 1024) |
68 | | - :a-usually-absent-string nil})))}) |
69 | | - |
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)}))) |
| 47 | + {:uuid (random-uuid) |
| 48 | + :uuid-string (enc/uuid-str) |
| 49 | + :uuid-strings (vec (repeatedly 4 #(enc/uuid-str 8))) |
| 50 | + :double (rand 65536) |
| 51 | + :doubles (vec (repeatedly 16 #(rand 65536))) |
| 52 | + :int (rand-int 65536) |
| 53 | + :ints (vec (repeatedly 16 #(rand-int 65536))) |
| 54 | + :date-str (str (enc/now-inst)) |
| 55 | + :bool (rand-nth [true false]) |
| 56 | + :bools (vec (repeatedly 16 #(rand-nth [true false]))) |
| 57 | + [nil #{:x :y}] {:complex-key? true} |
| 58 | + "bed6400a-785e-4a83-a41d-e5b566cd8950" :long-key1 |
| 59 | + "1dfe33be-a765-4017-ad36-4e2fbc9d7d9b" :long-key2 |
| 60 | + "7de8a506-acc9-4b33-9d19-918d1c5f5034" :long-key3 |
| 61 | + "37b4e00a-f8a4-4646-95b1-612f7640f011" :long-key4})))}) |
| 62 | + |
| 63 | +(def td1 (get-test-data)) |
| 64 | +(def td2 (get-test-data)) |
| 65 | + |
| 66 | +;;;; Packers |
| 67 | + |
| 68 | +(defn roundtrip |
| 69 | + "Returns Clj/s promise." |
| 70 | + ([data packer cb-fn] |
| 71 | + (i/pack packer nil data |
| 72 | + (fn [packed] |
| 73 | + (i/unpack packer nil (get packed :value) |
| 74 | + (fn [unpacked] (cb-fn (get unpacked :value))))))) |
| 75 | + |
| 76 | + ([data packer] |
| 77 | + #?(:clj (let [p (promise)] (roundtrip data packer (fn [v] (deliver p v))) p) |
| 78 | + :cljs (js/Promise. (fn [resolve _reject] (roundtrip data packer (fn [v] (resolve v)))))))) |
| 79 | + |
| 80 | +(comment @(roundtrip :data (ep/get-packer))) |
| 81 | + |
| 82 | +(defn test-promise [p f] ; f is test-fn |
| 83 | + #?(:clj (f (deref p timeout-msecs :timeout)) |
| 84 | + :cljs |
| 85 | + (test/async done |
| 86 | + (let [done (let [run?_ (atom false)] (fn [] (when (compare-and-set! run?_ false true) (done)))) |
| 87 | + timer (js/setTimeout #(do (f :timeout) (done)) timeout-msecs)] |
| 88 | + (-> p |
| 89 | + (.then (fn [v] (js/clearTimeout timer) (f v))) |
| 90 | + (.catch (fn [e] (js/clearTimeout timer) (f e))) |
| 91 | + (.finally (fn [ ] (js/clearTimeout timer) (done)))))))) |
| 92 | + |
| 93 | +(do |
| 94 | + (deftest test-packer-edn (test-promise (roundtrip td1 (ep/get-packer)) #(is (= td1 %)))) |
| 95 | + (deftest test-packer-transit (test-promise (roundtrip td1 (tp/get-packer)) #(is (= td1 %)))) |
| 96 | + (deftest test-packer-msgpack (test-promise (roundtrip td1 (mp/get-packer)) #(is (= td1 %)))) |
| 97 | + (deftest test-packer-gz+edn (test-promise (roundtrip td1 (gz/wrap-packer (ep/get-packer) {:binary? false})) #(is (= td1 %)))) |
| 98 | + (deftest test-packer-gz+transit (test-promise (roundtrip td1 (gz/wrap-packer (tp/get-packer) {:binary? false})) #(is (= td1 %)))) |
| 99 | + (deftest test-packer-gz+msgpack (test-promise (roundtrip td1 (gz/wrap-packer (mp/get-packer) {:binary? true})) #(is (= td1 %))))) |
| 100 | + |
| 101 | +;;;; Benching |
| 102 | + |
| 103 | +(defn packed-len [x] #?(:clj (count x), :cljs (if (instance? js/Uint8Array x) (.-length x) (count x)))) |
| 104 | + |
| 105 | +(defn bench1 |
| 106 | + "Returns Clj/s promise." |
| 107 | + [data packer] |
| 108 | + #?(:clj |
| 109 | + (let [size (let [p (promise)] (i/pack packer nil data #(deliver p (packed-len (get % :value)))) (deref p timeout-msecs -1)) |
| 110 | + t0 (enc/now-nano)] |
| 111 | + |
| 112 | + (dotimes [_ bench-laps] (deref (roundtrip data packer) timeout-msecs :timeout)) |
| 113 | + (let [msecs (enc/round (/ (- (enc/now-nano) t0) 1e6))] |
| 114 | + (deliver (promise) {:size size, :msecs msecs}))) |
| 115 | + |
| 116 | + :cljs |
| 117 | + (-> |
| 118 | + (js/Promise. (fn [resolve _] (i/pack packer nil data #(resolve (get % :value))))) |
| 119 | + (.then |
| 120 | + (fn [packed] |
| 121 | + (let [size (packed-len packed) |
| 122 | + t0 (enc/now-nano) |
| 123 | + step |
| 124 | + (fn step [i] |
| 125 | + (if (< i bench-laps) |
| 126 | + (-> (roundtrip data packer) (.then (fn [_] (step (inc i))))) |
| 127 | + (let [msecs (enc/round (/ (- (enc/now-nano) t0) 1e6))] |
| 128 | + (js/Promise.resolve {:size size, :msecs msecs}))))] |
| 129 | + (step 0))))))) |
| 130 | + |
| 131 | +(def benched_ (atom {})) |
| 132 | +(defn >benched [id] (fn [val] (swap! benched_ assoc id val))) |
| 133 | + |
| 134 | +(test/use-fixtures :once |
| 135 | + (taoensso.encore/test-fixtures |
| 136 | + {:after |
| 137 | + (fn [] |
| 138 | + (println "Benchmarks:") |
| 139 | + (doseq [[id results] (sort @benched_)] |
| 140 | + (println (str (name id) ": " results))))})) |
| 141 | + |
| 142 | +(do |
| 143 | + (deftest bench-packer-edn (test-promise (bench1 td1 (ep/get-packer)) (>benched :edn))) |
| 144 | + (deftest bench-packer-transit (test-promise (bench1 td1 (tp/get-packer)) (>benched :transit))) |
| 145 | + (deftest bench-packer-msgpack (test-promise (bench1 td1 (mp/get-packer)) (>benched :msgpack))) |
| 146 | + (deftest bench-packer-gz+edn (test-promise (bench1 td1 (gz/wrap-packer (ep/get-packer) {:binary? false})) (>benched :edn+gz))) |
| 147 | + (deftest bench-packer-gz+transit (test-promise (bench1 td1 (gz/wrap-packer (tp/get-packer) {:binary? false})) (>benched :transit+gz))) |
| 148 | + (deftest bench-packer-gz+msgpack (test-promise (bench1 td1 (gz/wrap-packer (mp/get-packer) {:binary? true})) (>benched :msgpack+gz)))) |
89 | 149 |
|
90 | 150 | ;;;; |
91 | 151 |
|
|
0 commit comments