mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-07 19:55:31 -05:00
new benchmarks for strings
This commit is contained in:
parent
5f188c4f7e
commit
b5f54e3424
4 changed files with 112 additions and 48 deletions
2
_oasis
2
_oasis
|
|
@ -155,7 +155,7 @@ Executable run_benchs
|
||||||
CompiledObject: best
|
CompiledObject: best
|
||||||
Build$: flag(bench)
|
Build$: flag(bench)
|
||||||
MainIs: run_benchs.ml
|
MainIs: run_benchs.ml
|
||||||
BuildDepends: containers, containers.advanced,
|
BuildDepends: containers, containers.advanced, QTest2Lib,
|
||||||
containers.data, containers.string, containers.iter,
|
containers.data, containers.string, containers.iter,
|
||||||
containers.thread, sequence, gen, benchmark, hamt
|
containers.thread, sequence, gen, benchmark, hamt
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1081,7 +1081,6 @@ module Thread = struct
|
||||||
end
|
end
|
||||||
|
|
||||||
module Graph = struct
|
module Graph = struct
|
||||||
|
|
||||||
(* divisors graph *)
|
(* divisors graph *)
|
||||||
let div_children_ i =
|
let div_children_ i =
|
||||||
(* divisors of [i] that are [>= j] *)
|
(* divisors of [i] that are [>= j] *)
|
||||||
|
|
@ -1155,6 +1154,115 @@ module Graph = struct
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module Str = struct
|
||||||
|
(* random string, but always returns the same for a given size *)
|
||||||
|
let rand_str_ n =
|
||||||
|
let module Q = Quickcheck in
|
||||||
|
let st = Random.State.make [| n |] in
|
||||||
|
let gen_c = Q.Gen.oneofl (CCString.to_list "abcdefghijkl") in
|
||||||
|
Q.Gen.string_size ~gen:gen_c (Q.Gen.return n) st
|
||||||
|
|
||||||
|
(* note: inefficient *)
|
||||||
|
let find ?(start=0) ~sub s =
|
||||||
|
let n = String.length sub in
|
||||||
|
let i = ref start in
|
||||||
|
try
|
||||||
|
while !i + n <= String.length s do
|
||||||
|
if CCString.is_sub ~sub 0 s !i ~len:n then raise Exit;
|
||||||
|
incr i
|
||||||
|
done;
|
||||||
|
-1
|
||||||
|
with Exit ->
|
||||||
|
!i
|
||||||
|
|
||||||
|
(* note: inefficient *)
|
||||||
|
let rfind ~sub s =
|
||||||
|
let n = String.length sub in
|
||||||
|
let i = ref (String.length s - n) in
|
||||||
|
try
|
||||||
|
while !i >= 0 do
|
||||||
|
if CCString.is_sub ~sub 0 s !i ~len:n then raise Exit;
|
||||||
|
decr i
|
||||||
|
done;
|
||||||
|
~-1
|
||||||
|
with Exit ->
|
||||||
|
!i
|
||||||
|
|
||||||
|
let find_all ?(start=0) ~sub s =
|
||||||
|
let i = ref start in
|
||||||
|
fun () ->
|
||||||
|
let res = find ~sub s ~start:!i in
|
||||||
|
if res = ~-1 then None
|
||||||
|
else (
|
||||||
|
i := res + String.length sub;
|
||||||
|
Some res
|
||||||
|
)
|
||||||
|
|
||||||
|
let find_all_l ?start ~sub s = find_all ?start ~sub s |> Gen.to_list
|
||||||
|
|
||||||
|
let pp_pb needle haystack =
|
||||||
|
Format.printf "search needle `%s` in `%s`...@."
|
||||||
|
needle (String.sub haystack 0 (min 300 (String.length haystack)))
|
||||||
|
|
||||||
|
(* benchmark String.{,r}find *)
|
||||||
|
let bench_find_ ~dir ~size n =
|
||||||
|
let needle = rand_str_ size in
|
||||||
|
let haystack = rand_str_ n in
|
||||||
|
pp_pb needle haystack;
|
||||||
|
let mk_naive = match dir with
|
||||||
|
| `Direct -> fun () -> find ~sub:needle haystack
|
||||||
|
| `Reverse -> fun () -> rfind ~sub:needle haystack
|
||||||
|
and mk_current = match dir with
|
||||||
|
| `Direct -> fun () -> CCString.find ~sub:needle haystack
|
||||||
|
| `Reverse -> fun () -> CCString.rfind ~sub:needle haystack
|
||||||
|
in
|
||||||
|
assert (mk_naive () = mk_current ());
|
||||||
|
B.throughputN 3 ~repeat
|
||||||
|
[ "naive", mk_naive, ()
|
||||||
|
; "current", mk_current, ()
|
||||||
|
]
|
||||||
|
|
||||||
|
(* benchmark String.find_all *)
|
||||||
|
let bench_find_all ~size n =
|
||||||
|
let needle = rand_str_ size in
|
||||||
|
let haystack = rand_str_ n in
|
||||||
|
pp_pb needle haystack;
|
||||||
|
let mk_naive () = find_all_l ~sub:needle haystack
|
||||||
|
and mk_current () = CCString.find_all_l ~sub:needle haystack in
|
||||||
|
assert (mk_naive () = mk_current ());
|
||||||
|
B.throughputN 3 ~repeat
|
||||||
|
[ "naive", mk_naive, ()
|
||||||
|
; "current", mk_current, ()
|
||||||
|
]
|
||||||
|
|
||||||
|
let bench_find = bench_find_ ~dir:`Direct
|
||||||
|
let bench_rfind = bench_find_ ~dir:`Reverse
|
||||||
|
|
||||||
|
let () = B.Tree.register (
|
||||||
|
"string" @>>>
|
||||||
|
[ "find" @>>>
|
||||||
|
[ "1" @>> app_ints (bench_find ~size:1) [100; 100_000; 500_000]
|
||||||
|
; "5" @>> app_ints (bench_find ~size:5) [100; 100_000; 500_000]
|
||||||
|
; "15" @>> app_ints (bench_find ~size:15) [100; 100_000; 500_000]
|
||||||
|
; "50" @>> app_ints (bench_find ~size:50) [100; 100_000; 500_000]
|
||||||
|
; "500" @>> app_ints (bench_find ~size:500) [100_000; 500_000]
|
||||||
|
];
|
||||||
|
"find_all" @>>>
|
||||||
|
[ "1" @>> app_ints (bench_find_all ~size:1) [100; 100_000; 500_000]
|
||||||
|
; "5" @>> app_ints (bench_find_all ~size:5) [100; 100_000; 500_000]
|
||||||
|
; "15" @>> app_ints (bench_find_all ~size:15) [100; 100_000; 500_000]
|
||||||
|
; "50" @>> app_ints (bench_find_all ~size:50) [100; 100_000; 500_000]
|
||||||
|
; "500" @>> app_ints (bench_find_all ~size:500) [100_000; 500_000]
|
||||||
|
];
|
||||||
|
"rfind" @>>>
|
||||||
|
[ "15" @>> app_ints (bench_rfind ~size:15) [100; 100_000; 500_000]
|
||||||
|
; "50" @>> app_ints (bench_rfind ~size:50) [100; 100_000; 500_000]
|
||||||
|
; "500" @>> app_ints (bench_rfind ~size:500) [100_000; 500_000]
|
||||||
|
];
|
||||||
|
])
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
module Alloc = struct
|
module Alloc = struct
|
||||||
module type ALLOC_ARR = sig
|
module type ALLOC_ARR = sig
|
||||||
type 'a t
|
type 'a t
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,5 @@
|
||||||
(*
|
|
||||||
copyright (c) 2013-2014, simon cruanes
|
|
||||||
all rights reserved.
|
|
||||||
|
|
||||||
redistribution and use in source and binary forms, with or without
|
(* This file is free software, part of containers. See file "license" for more details. *)
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer. redistributions in binary
|
|
||||||
form must reproduce the above copyright notice, this list of conditions and the
|
|
||||||
following disclaimer in the documentation and/or other materials provided with
|
|
||||||
the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*)
|
|
||||||
|
|
||||||
(** {1 Knuth-Morris-Pratt} *)
|
(** {1 Knuth-Morris-Pratt} *)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,5 @@
|
||||||
(*
|
|
||||||
copyright (c) 2013-2014, simon cruanes
|
|
||||||
all rights reserved.
|
|
||||||
|
|
||||||
redistribution and use in source and binary forms, with or without
|
(* This file is free software, part of containers. See file "license" for more details. *)
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer. redistributions in binary
|
|
||||||
form must reproduce the above copyright notice, this list of conditions and the
|
|
||||||
following disclaimer in the documentation and/or other materials provided with
|
|
||||||
the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*)
|
|
||||||
|
|
||||||
(** {1 Knuth-Morris-Pratt} *)
|
(** {1 Knuth-Morris-Pratt} *)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue