Skip to content

Commit fb49543

Browse files
committed
Added moderate heavy workload;
Fixed bug that made find_in go from O(n) to O(log n)
1 parent 7a1b128 commit fb49543

File tree

3 files changed

+42
-11
lines changed

3 files changed

+42
-11
lines changed

bench/bench_atomic_skiplist.ml

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ let write_heavy_workload () =
2525
(* A regular workload with 90% reads, 9% adds and 1% removes. *)
2626
let read_heavy_workload () =
2727
let sl = Atomicskiplist.create () in
28-
let elems = Array.init num_elems (fun _ -> Random.int 100) in
28+
let elems = Array.init num_elems (fun _ -> Random.int 10000) in
2929
let push = (fun () -> Domain.spawn ( fun () ->
3030
let start_time = Unix.gettimeofday () in
3131
for i = 0 to (num_elems - 1) do (
3232
if i mod 1000 < 90 then
3333
Atomicskiplist.add sl elems.(i) |> ignore
34-
else if i mod 1000 > 90 && i mod 1000 < 100 then
34+
else if i mod 1000 >= 90 && i mod 1000 < 100 then
3535
Atomicskiplist.remove sl elems.(i) |> ignore
3636
else
3737
Atomicskiplist.find sl elems.(i) |> ignore
@@ -44,14 +44,39 @@ let read_heavy_workload () =
4444
let end_time = Unix.gettimeofday () in
4545
let time_diff = end_time -. (List.nth start_time_threads 0) in
4646
time_diff
47-
47+
48+
49+
let moderate_heavy_workload () =
50+
let sl = Atomicskiplist.create () in
51+
let elems = Array.init num_elems (fun _ -> Random.int 10000) in
52+
let push = (fun () -> Domain.spawn ( fun () ->
53+
let start_time = Unix.gettimeofday () in
54+
for i = 0 to (num_elems - 1) do (
55+
if i mod 1000 < 200 then
56+
Atomicskiplist.add sl elems.(i) |> ignore
57+
else if i mod 1000 >= 200 && i mod 1000 < 300 then
58+
Atomicskiplist.remove sl elems.(i) |> ignore
59+
else
60+
Atomicskiplist.find sl elems.(i) |> ignore
61+
)
62+
done;
63+
start_time
64+
)) in
65+
let threads = List.init num_threads (fun _ -> push ()) in
66+
let start_time_threads = List.map (fun domain -> Domain.join domain) threads in
67+
let end_time = Unix.gettimeofday () in
68+
let time_diff = end_time -. (List.nth start_time_threads 0) in
69+
time_diff
70+
4871

4972

5073
let bench ~workload_type () =
5174
let workload =
5275
if workload_type = "read_heavy" then
5376
read_heavy_workload
54-
else
77+
else if workload_type == "moderate_heavy" then
78+
moderate_heavy_workload
79+
else
5580
write_heavy_workload
5681
in
5782
let results = ref [] in

bench/main.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ let benchmark_list =
1717
Mpmc_queue.bench ~use_cas:true ~takers:1 ~pushers:8;
1818
Mpmc_queue.bench ~use_cas:true ~takers:8 ~pushers:1;
1919
Bench_atomic_skiplist.bench ~workload_type:"read_heavy";
20+
Bench_atomic_skiplist.bench ~workload_type:"moderate_heavy";
2021
]
2122
@ backoff_benchmarks
2223

src/atomicskiplist.ml

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ let compare_and_set_mark_ref (atomic, old_node, old_mark, node, mark) =
6969
*)
7070
let find_in (key, preds, succs, sl) =
7171
let head = sl.head in
72-
let init level =
73-
let prev = head in
72+
let init prev level =
73+
let prev = prev in
7474
let curr = get_ref prev.next.(level) in
7575
let succ, mark = get_mark_ref curr.next.(level) in
7676
(prev, curr, succ, mark)
@@ -90,17 +90,22 @@ let find_in (key, preds, succs, sl) =
9090
iterate (curr, succ, new_succ, mark, level)
9191
else (prev, curr)
9292
in
93-
let rec update_arrays level =
94-
let prev, curr, succ, mark = init level in
93+
let rec update_arrays prev level =
94+
let prev, curr, succ, mark =
95+
if level == max_height then
96+
init head level
97+
else
98+
init prev level
99+
in
95100
let prev, curr = iterate (prev, curr, succ, mark, level) in
96-
if prev == null_node && curr == null_node then update_arrays max_height
101+
if prev == null_node && curr == null_node then update_arrays null_node max_height
97102
else (
98103
preds.(level) <- prev;
99104
succs.(level) <- curr;
100-
if level > 0 then update_arrays (level - 1)
105+
if level > 0 then update_arrays prev (level - 1)
101106
else curr.key == key)
102107
in
103-
update_arrays max_height
108+
update_arrays null_node max_height
104109

105110
(** Adds a new key to the skiplist sl. *)
106111
let add sl key =

0 commit comments

Comments
 (0)