(******************************************************************************) (* ocaml-fileutils: files and filenames common operations *) (* *) (* Copyright (C) 2003-2014, Sylvain Le Gall *) (* *) (* This library is free software; you can redistribute it and/or modify it *) (* under the terms of the GNU Lesser General Public License as published by *) (* the Free Software Foundation; either version 2.1 of the License, or (at *) (* your option) any later version, with the OCaml static compilation *) (* exception. *) (* *) (* This library is distributed in the hope that it will be useful, but *) (* WITHOUT ANY WARRANTY; without even the implied warranty of *) (* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the file *) (* COPYING for more details. *) (* *) (* You should have received a copy of the GNU Lesser General Public License *) (* along with this library; if not, write to the Free Software Foundation, *) (* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *) (******************************************************************************) (* What should be the fastest possible function in OCaml. *) let rec simple fn = let st = Unix.lstat fn in match st.Unix.st_kind with | Unix.S_DIR -> begin let fd = Unix.opendir fn in try while true do let bn = Unix.readdir fd in if bn <> "." && bn <> ".." then simple (Filename.concat fn bn) done with End_of_file -> Unix.closedir fd end | Unix.S_LNK -> () | _ -> () let () = let dir = "/home/gildor" in let sys_find () = let _i: int = Sys.command ("find "^(Filename.quote dir)^" -name '*.mp3' \ | (echo -n 'Count: '; wc -l)") in () in let fileutils_find () = let count = FileUtil.find (FileUtil.Has_extension "mp3") dir (fun i _ -> i + 1) 0 in Printf.eprintf "Count: %d\n%!" count in let time str f = let start_time = Unix.gettimeofday () in let time = prerr_endline str; f (); (Unix.gettimeofday ()) -. start_time in Printf.eprintf "Time: %.2fs\n%!" time; time in let () = prerr_endline "System find (load)"; sys_find () in let time_ref = time "System find (reference)" sys_find in let time_fileutils = time "FileUtil find" fileutils_find in let _time_simple = time "Simple" (fun () -> simple dir) in Printf.eprintf "Performance: %.2f%%\n%!" (100.0 *. (time_ref /. time_fileutils))