Skip to content

Commit 791c68e

Browse files
committed
Improve MST/repo performance
1 parent 57e06aa commit 791c68e

File tree

6 files changed

+600
-362
lines changed

6 files changed

+600
-362
lines changed

ipld/lib/dag_cbor.ml

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
module String_map = Map.Make (String)
22

3+
(* sort map keys by length first, then lexicographically *)
4+
let dag_cbor_key_compare a b =
5+
let la = String.length a in
6+
let lb = String.length b in
7+
if la = lb then String.compare a b else compare la lb
8+
39
let ordered_map_keys (m : 'a String_map.t) : string list =
410
let keys = String_map.bindings m |> List.map fst in
5-
List.sort
6-
(fun a b ->
7-
let la = String.length a in
8-
let lb = String.length b in
9-
if la = lb then String.compare a b else compare la lb )
10-
keys
11+
List.sort dag_cbor_key_compare keys
12+
13+
(* returns bindings sorted in dag-cbor canonical order *)
14+
let ordered_map_bindings (m : 'a String_map.t) : (string * 'a) list =
15+
String_map.bindings m |> List.sort (fun (a, _) (b, _) -> dag_cbor_key_compare a b)
1116

1217
let type_info_length len =
1318
if len < 24 then 1
@@ -195,10 +200,10 @@ module Encoder = struct
195200
| `Map m ->
196201
let len = String_map.cardinal m in
197202
write_type_and_argument t 5 (Int64.of_int len) ;
198-
ordered_map_keys m
199-
|> List.iter (fun k ->
203+
ordered_map_bindings m
204+
|> List.iter (fun (k, v) ->
200205
write_string t k ;
201-
write_value t (String_map.find k m) )
206+
write_value t v )
202207
| `Link cid ->
203208
write_cid t cid
204209

0 commit comments

Comments
 (0)