|
4 | 4 | [clojure.tools.cli :refer [parse-opts]]
|
5 | 5 | [excel-templates.build :as excel]
|
6 | 6 | [hitchhiker.redis :as redis]
|
7 |
| - [hitchhiker.tree.core :as core] |
| 7 | + [hitchhiker.tree.core :refer [<?? <? go-try] :as core] |
8 | 8 | [hitchhiker.tree.messaging :as msg])
|
9 | 9 | (:import [java.io File FileWriter]))
|
10 | 10 |
|
|
17 | 17 | (defn core-b-tree
|
18 | 18 | "Returns a b-tree with core insert"
|
19 | 19 | [b backend]
|
20 |
| - {:structure (core/b-tree (core/->Config b b 0)) |
| 20 | + {:structure (<?? (core/b-tree (core/->Config b b 0))) |
21 | 21 | :insert core/insert
|
22 | 22 | :delete core/delete
|
23 |
| - :flush (fn [x] (core/flush-tree x backend))}) |
| 23 | + :flush (fn [x] (<?? (core/flush-tree x backend)))}) |
24 | 24 |
|
25 | 25 | (defn msg-b-tree
|
26 | 26 | "Returns a b-tree with msg insert"
|
27 | 27 | [b backend]
|
28 | 28 | (let [sqrt-b (long (Math/sqrt b))]
|
29 |
| - {:structure (core/b-tree(core/->Config sqrt-b b (- b sqrt-b))) |
| 29 | + {:structure (<?? (core/b-tree(core/->Config sqrt-b b (- b sqrt-b)))) |
30 | 30 | :insert msg/insert
|
31 | 31 | :delete msg/delete
|
32 |
| - :flush (fn [x] (core/flush-tree x backend))})) |
| 32 | + :flush (fn [x] (<?? (core/flush-tree x backend)))})) |
33 | 33 |
|
34 | 34 | (defn sorted-set-repr
|
35 | 35 | "Returns a sorted set"
|
36 | 36 | []
|
37 | 37 | {:structure (sorted-map)
|
38 |
| - :insert assoc |
39 |
| - :delete dissoc |
| 38 | + :insert (fn [m k v] (go-try (assoc m k v))) |
| 39 | + :delete (fn [m k] (go-try (dissoc m k))) |
40 | 40 | :flush (fn [set]
|
41 | 41 | {:tree set
|
42 | 42 | :stats (atom {})})})
|
|
64 | 64 | [n dataset flush-freq datastruct out delete-xform]
|
65 | 65 | (let [{:keys [structure delete insert flush]} datastruct
|
66 | 66 | dataset (take n (:data dataset))]
|
67 |
| - (loop [[x & data] dataset |
68 |
| - t 0 |
69 |
| - tree structure |
70 |
| - last-flush nil |
71 |
| - i 0 |
72 |
| - inserting? true |
73 |
| - outputs []] |
74 |
| - (let [i' (inc i) |
75 |
| - {flushed-tree :tree |
76 |
| - stats :stats} (when (zero? (mod i' flush-freq)) |
77 |
| - (flush tree)) |
78 |
| - before (System/nanoTime) |
79 |
| - tree' (if inserting? |
80 |
| - (insert (or flushed-tree tree) x x) |
81 |
| - (delete (or flushed-tree tree) x)) |
82 |
| - after (System/nanoTime) |
83 |
| - log-inserts (zero? (mod i' (quot n 100))) |
84 |
| - updated-outputs (atom outputs)] |
85 |
| - (when log-inserts ;; 1000 pieces |
86 |
| - (binding [*out* (:speed out)] |
87 |
| - (let [ks (sort (keys last-flush)) |
88 |
| - avg-ns (float (/ t (quot n 100)))] |
89 |
| - (when (zero? i) |
90 |
| - (println (str "elements,op,insert_took_avg_ns," |
91 |
| - (str/join "," ks)))) |
92 |
| - (println (str i' "," (if inserting? "insert" "delete") "," avg-ns |
93 |
| - "," (str/join "," (map #(get last-flush %) ks)))) |
94 |
| - (swap! updated-outputs conj (-> (into {} last-flush) |
95 |
| - (assoc :ins-avg-ns avg-ns |
96 |
| - (if inserting? |
97 |
| - :insert |
98 |
| - :delete) true |
99 |
| - :n i')))))) |
100 |
| - (cond |
101 |
| - (seq data) |
102 |
| - (recur data |
103 |
| - (if log-inserts |
104 |
| - 0 |
105 |
| - (+ t (- after before))) |
106 |
| - tree' |
107 |
| - (if stats (merge-with + last-flush @stats) last-flush) |
108 |
| - i' |
109 |
| - inserting? |
110 |
| - @updated-outputs) |
111 |
| - inserting? |
112 |
| - (recur (delete-xform dataset) |
113 |
| - 0 |
114 |
| - tree' |
115 |
| - nil |
116 |
| - i' |
117 |
| - false |
118 |
| - @updated-outputs) |
119 |
| - :else |
120 |
| - @updated-outputs))))) |
| 67 | + (<?? (go-try |
| 68 | + (loop [[x & data] dataset |
| 69 | + t 0 |
| 70 | + tree structure |
| 71 | + last-flush nil |
| 72 | + i 0 |
| 73 | + inserting? true |
| 74 | + outputs []] |
| 75 | + (let [i' (inc i) |
| 76 | + {flushed-tree :tree |
| 77 | + stats :stats} (when (zero? (mod i' flush-freq)) |
| 78 | + (flush tree)) |
| 79 | + before (System/nanoTime) |
| 80 | + tree' (if inserting? |
| 81 | + (<? (insert (or flushed-tree tree) x x)) |
| 82 | + (<? (delete (or flushed-tree tree) x))) |
| 83 | + after (System/nanoTime) |
| 84 | + log-inserts (zero? (mod i' (quot n 100))) |
| 85 | + updated-outputs (atom outputs)] |
| 86 | + (when log-inserts ;; 1000 pieces |
| 87 | + (binding [*out* (:speed out)] |
| 88 | + (let [ks (sort (keys last-flush)) |
| 89 | + avg-ns (float (/ t (quot n 100)))] |
| 90 | + (when (zero? i) |
| 91 | + (println (str "elements,op,insert_took_avg_ns," |
| 92 | + (str/join "," ks)))) |
| 93 | + (println (str i' "," (if inserting? "insert" "delete") "," avg-ns |
| 94 | + "," (str/join "," (map #(get last-flush %) ks)))) |
| 95 | + (swap! updated-outputs conj (-> (into {} last-flush) |
| 96 | + (assoc :ins-avg-ns avg-ns |
| 97 | + (if inserting? |
| 98 | + :insert |
| 99 | + :delete) true |
| 100 | + :n i')))))) |
| 101 | + (cond |
| 102 | + (seq data) |
| 103 | + (recur data |
| 104 | + (if log-inserts |
| 105 | + 0 |
| 106 | + (+ t (- after before))) |
| 107 | + tree' |
| 108 | + (if stats (merge-with + last-flush @stats) last-flush) |
| 109 | + i' |
| 110 | + inserting? |
| 111 | + @updated-outputs) |
| 112 | + inserting? |
| 113 | + (recur (delete-xform dataset) |
| 114 | + 0 |
| 115 | + tree' |
| 116 | + nil |
| 117 | + i' |
| 118 | + false |
| 119 | + @updated-outputs) |
| 120 | + :else |
| 121 | + @updated-outputs))))))) |
121 | 122 |
|
122 | 123 | (def options
|
123 | 124 | [["-n" "--num-operations NUM_OPS" "The number of elements that will be applied to the data structure"
|
|
0 commit comments