Browse Source

Add benchmark for a swaping command

This benchmark was run without core_bench, unavailable at the time, needs to
be done once again
Leo 9 years ago
parent
commit
d66446e938
3 changed files with 118 additions and 0 deletions
  1. 6 0
      bench/.merlin
  2. 1 0
      bench/Makefile
  3. 111 0
      bench/swap.ml

+ 6 - 0
bench/.merlin

@@ -0,0 +1,6 @@
+PKG core yojson atdgen core_extended
+
+S *
+
+B ./_build/src/
+

+ 1 - 0
bench/Makefile

@@ -1,2 +1,3 @@
 all:
 	corebuild -pkg core_bench sprintf_vs_concat.byte
+	corebuild -pkg core_bench swap.byte

+ 111 - 0
bench/swap.ml

@@ -0,0 +1,111 @@
+(******************************************************************************)
+(* Copyright © Joly Clément, 2015                                        *)
+(*                                                                            *)
+(*  leowzukw@vmail.me                                                         *)
+(*                                                                            *)
+(*  Ce logiciel est un programme informatique servant à exécuter              *)
+(*  automatiquement des programmes à l'ouverture du terminal.                 *)
+(*                                                                            *)
+(*  Ce logiciel est régi par la licence CeCILL soumise au droit français et   *)
+(*  respectant les principes de diffusion des logiciels libres. Vous pouvez   *)
+(*  utiliser, modifier et/ou redistribuer ce programme sous les conditions    *)
+(*  de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA    *)
+(*  sur le site "http://www.cecill.info".                                     *)
+(*                                                                            *)
+(*  En contrepartie de l'accessibilité au code source et des droits de copie, *)
+(*  de modification et de redistribution accordés par cette licence, il n'est *)
+(*  offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons, *)
+(*  seule une responsabilité restreinte pèse sur l'auteur du programme,  le   *)
+(*  titulaire des droits patrimoniaux et les concédants successifs.           *)
+(*                                                                            *)
+(*  A cet égard  l'attention de l'utilisateur est attirée sur les risques     *)
+(*  associés au chargement,  à l'utilisation,  à la modification et/ou au     *)
+(*  développement et à la reproduction du logiciel par l'utilisateur étant    *)
+(*  donné sa spécificité de logiciel libre, qui peut le rendre complexe à     *)
+(*  manipuler et qui le réserve donc à des développeurs et des professionnels *)
+(*  avertis possédant  des  connaissances  informatiques approfondies.  Les   *)
+(*  utilisateurs sont donc invités à charger  et  tester  l'adéquation  du    *)
+(*  logiciel à leurs besoins dans des conditions permettant d'assurer la      *)
+(*  sécurité de leurs systèmes et ou de leurs données et, plus généralement,  *)
+(*  à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.        *)
+(*                                                                            *)
+(*  Le fait que vous puissiez accéder à cet en-tête signifie que vous avez    *)
+(*  pris connaissance de la licence CeCILL, et que vous en avez accepté les   *)
+(*  termes.                                                                   *)
+(******************************************************************************)
+
+open Core.Std
+(*open Core_bench.Std*)
+
+(* File to test who is the faster to swap two elements *)
+(* TODO:
+  * Use core_bench for trustable result
+  * Improve list algo ?
+  * Verify that output of all functions are the same *)
+
+(* Arguments:
+  * li: a list of elements
+  * a,b: positions
+  * a < b*)
+
+let data =  List.init 5 ~f:(fun i -> i)
+let big_data = List.init 1_000_000 ~f:(fun i -> i)
+
+(* With an array *)
+let array li a b =
+  let ar = List.to_array li in
+  (* Store a value *)
+  let v = ar.(a) in
+  ar.(a) <- ar.(a);
+  ar.(b) <- v;
+  Array.to_list ar
+;;
+
+(* Manipulating list *)
+let list li a b =
+  (* We need 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 (* Ephemeral value, to swap *)
+  let a' = ref b' in (* Avoid walk around the list twice *)
+  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 tests = [
+  "Array - small list", (fun () -> array data 2 4);
+  "Array - big list", (fun () -> array big_data 20 80);
+  "List - small list", (fun () -> list data 2 4);
+  "List - big list", (fun () -> list big_data 20 80);
+]
+
+(*let () =*)
+  (*List.map tests ~f:(fun (name,test) -> Bench.Test.create ~name test)*)
+  (*|> Bench.make_command*)
+  (*|> Command.run*)
+
+(* Manual way to test, it don't have core_bench yet *)
+let man_run f =
+  let open Time in
+  let start = now () in
+  let i = f () in
+  let stop = now () in
+  diff stop start |> Core.Span.to_string
+;;
+
+let () =
+  List.map tests ~f:(fun (name,test) -> ( name, man_run test ))
+  |> List.iter ~f:(fun ( name, duration ) -> printf "%s: %s\n" name duration)
+