123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- open Core.Std
- open Core_bench.Std
- let data = List.init 5 ~f:(fun i -> i)
- let big_data = List.init 1_000_000 ~f:(fun i -> i)
- let array li a b =
- let ar = List.to_array li in
-
- let v = ar.(a) in
- ar.(a) <- ar.(b);
- ar.(b) <- v;
- Array.to_list ar
- ;;
- let list li a b =
-
- let ( a, b ) : ( int * int ) =
- if a < b
- then ( a, b )
- else ( b, a )
- in
- let b' = List.nth_exn li b in
- let a' = ref b' in
- List.mapi li
- ~f:(fun i element ->
- if i = a
- then begin
- a' := element;
- b'
- end
- else if i = b
- then !a'
- else
- element
- )
- ;;
- let once li a b =
- let rec worker li head middle tail ~ca ~cb ~i =
- match ( ca, cb ) with
- | ( Some ca ), ( Some cb ) -> head @ [cb] @ middle @ [ca] @ tail
- | _ -> li |> (function
- | hd :: tl ->
- if i < a
- then worker tl (head @ [hd]) middle tail ~ca ~cb ~i:(succ i)
- else if i = a
- then worker tl head middle tail ~ca:(Some hd) ~cb ~i:(succ i)
- else if i < b
- then worker tl head (middle @ [hd]) tail ~ca ~cb ~i:(succ i)
- else if i = b
- then worker ~ca ~cb:(Some hd) tl ~i:(succ i) head middle tail
- else if i > b
- then worker [] head middle li ~ca ~cb ~i:(-1)
- else assert false
- | [] -> [])
- in
- let ( a, b ) = if a < b then (a,b) else (b,a) in
- worker li [] [] [] ~ca:None ~cb:None ~i:0
- ;;
- let a' = 2;;
- let b' = 4;;
- let a'' = 0;;
- let b'' = 10_000 - 1;;
- let print_li li =
- printf "[ ";
- List.iter li ~f:(fun e -> printf "%i; " e);
- printf "]\n"
- ;;
- print_li (array data a' b');;
- print_li (list data a' b');;
- print_li (once data a' b');;
- let tests = [
- "Array - small list", (fun () -> array data a' b');
- "Array - big list", (fun () -> array big_data a'' b'');
- "List - small list", (fun () -> list data a' b');
- "List - big list", (fun () -> list big_data a'' b'');
- "Once - small list", (fun () -> once data a' b');
- "Once - big once", (fun () -> once big_data a'' b'');
- ]
- let () =
- List.map tests ~f:(fun (name,test) -> Bench.Test.create ~name test)
- |> Bench.make_command
- |> Command.run
|