feat(tests/playground/rbmap_checkpoint): add rbmap_shared benchmark (rbmap_checkpoint with freq=1)
This commit is contained in:
parent
9a3a01fa6e
commit
b1a8e22ac3
2 changed files with 79 additions and 3 deletions
|
|
@ -1,7 +1,7 @@
|
|||
## CONFIG
|
||||
|
||||
BENCH=ulimit -s unlimited && bench
|
||||
CROSS_BENCHES = binarytrees deriv expr_const_folding rbmap
|
||||
CROSS_BENCHES = binarytrees deriv expr_const_folding rbmap rbmap_shared
|
||||
|
||||
# basic version usable without Nix
|
||||
#CROSS_CATS = .lean .perf.lean .hs .gc.hs .perf.hs .llvm.hs .ml .gc.ml .perf.ml
|
||||
|
|
@ -23,8 +23,9 @@ OCAML ?= ocamlopt.opt
|
|||
|
||||
all: report_cross.csv
|
||||
|
||||
# make gets confused by the .cpp files otherwise
|
||||
%.lean: ;
|
||||
# disable some built-in rules
|
||||
%.lean:
|
||||
%.out: %
|
||||
|
||||
%.lean.cpp: %.lean
|
||||
$(LEAN_BIN)/lean --cpp=$@ $<
|
||||
|
|
@ -66,6 +67,9 @@ bench/binarytrees.%.bench: BENCH_PARAMS = 21
|
|||
|
||||
bench/rbmap.%.bench: BENCH_PARAMS = 7000000
|
||||
|
||||
rbmap_shared.%.out: rbmap_checkpoint.%.out; ln -f $< $@
|
||||
bench/rbmap_shared.%.bench: BENCH_PARAMS = 500000 1
|
||||
|
||||
bench/%gc.hs.bench: %hs.out | bench
|
||||
./$< +RTS -t --machine-readable -RTS $(BENCH_PARAMS) 2> $@
|
||||
|
||||
|
|
|
|||
72
tests/playground/rbmap_checkpoint.ml
Normal file
72
tests/playground/rbmap_checkpoint.ml
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
type color =
|
||||
| Red
|
||||
| Black;;
|
||||
|
||||
type node =
|
||||
| Leaf
|
||||
| Node of color * node * int * bool * node;;
|
||||
|
||||
let balance1 kv vv t n =
|
||||
match n with
|
||||
| Node (c, Node (Red, l, kx, vx, r1), ky, vy, r2) -> Node (Red, Node (Black, l, kx, vx, r1), ky, vy, Node (Black, r2, kv, vv, t))
|
||||
| Node (c, l1, ky, vy, Node (Red, l2, kx, vx, r)) -> Node (Red, Node (Black, l1, ky, vy, l2), kx, vx, Node (Black, r, kv, vv, t))
|
||||
| Node (c, l, ky, vy, r) -> Node (Black, Node (Red, l, ky, vy, r), kv, vv, t)
|
||||
| n -> Leaf;;
|
||||
|
||||
let balance2 t kv vv n =
|
||||
match n with
|
||||
| Node (_, Node (Red, l, kx1, vx1, r1), ky, vy, r2) -> Node (Red, Node (Black, t, kv, vv, l), kx1, vx1, Node (Black, r1, ky, vy, r2))
|
||||
| Node (_, l1, ky, vy, Node (Red, l2, kx2, vx2, r2)) -> Node (Red, Node (Black, t, kv, vv, l1), ky, vy, Node (Black, l2, kx2, vx2, r2))
|
||||
| Node (_, l, ky, vy, r) -> Node (Black, t, kv, vv, Node (Red, l, ky, vy, r))
|
||||
| n -> Leaf;;
|
||||
|
||||
let is_red t =
|
||||
match t with
|
||||
| Node (Red, _, _, _, _) -> true
|
||||
| _ -> false;;
|
||||
|
||||
let rec ins t kx vx =
|
||||
match t with
|
||||
| Leaf -> Node (Red, Leaf, kx, vx, Leaf)
|
||||
| Node (Red, a, ky, vy, b) ->
|
||||
if kx < ky then Node (Red, ins a kx vx, ky, vy, b)
|
||||
else if ky = kx then Node (Red, a, kx, vx, b)
|
||||
else Node (Red, a, ky, vy, ins b kx vx)
|
||||
| Node (Black, a, ky, vy, b) ->
|
||||
if kx < ky then
|
||||
(if is_red a then balance1 ky vy b (ins a kx vx)
|
||||
else Node (Black, (ins a kx vx), ky, vy, b))
|
||||
else if kx = ky then Node (Black, a, kx, vx, b)
|
||||
else if is_red b then balance2 a ky vy (ins b kx vx)
|
||||
else Node (Black, a, ky, vy, (ins b kx vx));;
|
||||
|
||||
let set_black n =
|
||||
match n with
|
||||
| Node (_, l, k, v, r) -> Node (Black, l, k, v, r)
|
||||
| e -> e;;
|
||||
|
||||
let insert t k v =
|
||||
if is_red t then set_black (ins t k v)
|
||||
else ins t k v;;
|
||||
|
||||
let rec fold f n d =
|
||||
match n with
|
||||
| Leaf -> d
|
||||
| Node(_, l, k, v, r) -> fold f r (f k v (fold f l d));;
|
||||
|
||||
let rec mk_map_aux freq n m r =
|
||||
if n = 0 then m::r
|
||||
else let n = n-1 in
|
||||
let m = insert m n (n mod 10 == 0) in
|
||||
let r = if n mod freq == 0 then m::r else r in
|
||||
mk_map_aux freq n m r;;
|
||||
|
||||
let mk_map n freq = mk_map_aux freq n Leaf [];;
|
||||
|
||||
let main n freq =
|
||||
let m = mk_map n freq in
|
||||
let v = fold (fun k v r -> if v then r + 1 else r) (List.hd m) 0 in
|
||||
Printf.printf "%8d\n" v;
|
||||
v;;
|
||||
|
||||
main (int_of_string Sys.argv.(1)) (int_of_string Sys.argv.(2));;
|
||||
Loading…
Add table
Reference in a new issue