Browse Source

String.concat is faster than sprintf

Estimated testing time 20s (2 benchmarks x 10s). Change using -quota SECS.
┌───────────────┬──────────┬─────────┬────────────┐
│ Name          │ Time/Run │ mWd/Run │ Percentage │
├───────────────┼──────────┼─────────┼────────────┤
│ Sprintf       │  19.40us │ 146.00w │    100.00% │
│ String.concat │   6.75us │  28.00w │     34.78% │
└───────────────┴──────────┴─────────┴────────────┘
Leo 10 years ago
parent
commit
f564ea39fa
2 changed files with 63 additions and 0 deletions
  1. 2 0
      bench/Makefile
  2. 61 0
      bench/sprintf_vs_concat.ml

+ 2 - 0
bench/Makefile

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

+ 61 - 0
bench/sprintf_vs_concat.ml

@@ -0,0 +1,61 @@
+(******************************************************************************)
+(* 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;;
+
+(* File to test who is the faster fo a special case *)
+open Core_bench.Std
+
+let str = "qwertyuiop"
+
+(* With sprintf *)
+let sprtf () =
+    sprintf "\n%s\n" str
+    |> ignore
+
+let conc () =
+    String.concat [ "\n" ; str ; "\n" ]
+    |> ignore
+
+let tests = [
+  "Sprintf", sprtf;
+  "String.concat", conc;
+]
+
+let () =
+  List.map tests ~f:(fun (name,test) -> Bench.Test.create ~name test)
+  |> Bench.make_command
+  |> Command.run