X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Ftatoo.ml;h=4d7e693c019b91dfb710bfac6cd77f4e0c40b059;hp=6dc66efe22226ce38d9a775f9f2b7c4534840faa;hb=398ce5dca1bee23f5137a3eba21df17d7aaaf1fa;hpb=5b5dcd45cf86701ccfe917c1d6ad73b83bb523c3 diff --git a/src/tatoo.ml b/src/tatoo.ml index 6dc66ef..4d7e693 100644 --- a/src/tatoo.ml +++ b/src/tatoo.ml @@ -13,41 +13,53 @@ (* *) (***********************************************************************) -(* - Time-stamp: -*) - open Format +let time f arg msg = + let t1 = Unix.gettimeofday () in + let r = f arg in + let t2 = Unix.gettimeofday () in + let time = (t2 -. t1) *. 1000. in + Logger.msg `STATS "%s: %fms" msg time; + r + + let main () = let () = Options.parse () in let doc = - let fd = open_in !Options.input_file in - let d = Naive_tree.load_xml_file fd in - close_in fd; d + let fd, close_fd = match !Options.input_file with + None -> stdin, ignore + | Some input -> + let fd = open_in input in fd, fun () -> close_in fd + in + let d = time Naive_tree.load_xml_file fd "parsing xml document" in + close_fd (); d in let query = - Xpath.Parser.parse (Ulexing.from_latin1_string !Options.query) + time + Xpath.Parser.parse + (Ulexing.from_latin1_string !Options.query) + "parsing XPath query" in let auto = - Xpath.Compile.path query + time Xpath.Compile.path query "compiling XPath query" in + let auto = time Ata.copy auto "copying Automaton" in let output = match !Options.output_file with | None | Some "-" | Some "/dev/stdout" -> stdout | Some f -> open_out f in if !Options.stats then begin - fprintf err_formatter "@[STATS: Query: %a @]@." Xpath.Ast.print_path query; - fprintf err_formatter "@[STATS: @[Automaton: @\n"; - Ata.print err_formatter auto; - fprintf err_formatter "@]@]@."; + Logger.msg `STATS "Query: %a " Xpath.Ast.print_path query; + Logger.msg `STATS "@[Automaton: @\n%a@]" Ata.print auto; end; - let module Naive = Eval.Make(Naive_tree) in - let t1 = Unix.gettimeofday() in - let results = Naive.eval auto doc (Naive_tree.root doc) in - let teval = (Unix.gettimeofday () -. t1) *. 1000. in - let t1 = Unix.gettimeofday () in + + let module Naive = Run.Make(Naive_tree) in + let results = + time (Naive.eval auto doc) ([Naive_tree.root doc]) "evaluating query" + in + time (fun () -> output_string output "\n"; if !Options.count then begin output_string output (string_of_int (List.length results)); @@ -58,13 +70,10 @@ let main () = output_char output '\n' ) results; output_string output "\n"; - let tprint = (Unix.gettimeofday () -. t1) *. 1000. in flush output; - if output != stdout then close_out output; - if !Options.stats then begin - fprintf err_formatter "@[STATS: evaluation time: %fms@]@." teval; - fprintf err_formatter "@[STATS: serialization time: %fms@]@." tprint - end + if output != stdout then close_out output + +) () "serializing results" let () = @@ -73,6 +82,10 @@ let () = with Arg.Bad msg -> eprintf "Error: %s\n%!" msg; Options.usage (); exit 1 | Sys_error msg -> eprintf "Error: %s\n%!" msg; exit 2 - | Tree.Parse_error msg -> eprintf "Error: file %s, %s\n%!" !Options.input_file msg; exit 3 + | Tree.Parse_error msg -> + eprintf "Error: %s, %s\n%!" + (match !Options.input_file with + Some s -> ("file " ^ s) + | None -> "[stdin]") msg; exit 3 | Xpath.Ulexer.Error (s, e, msg) -> eprintf "Error: character %i-%i: %s\n%!" s e msg; exit 4 | e -> eprintf "FATAL ERROR: %s\n%!" (Printexc.to_string e); exit 128