X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Ftatoo.ml;h=5e8144da55a55d75ed2f76c3622858c5100a9932;hp=e0f29ee8dff4b43df89e93eb4d5a095e59135523;hb=84751fead39221a8e01d20a4692faf0b63a7c996;hpb=836d6ea0aebf1f947faa74db1d78168afb882930 diff --git a/src/tatoo.ml b/src/tatoo.ml index e0f29ee..5e8144d 100644 --- a/src/tatoo.ml +++ b/src/tatoo.ml @@ -14,6 +14,13 @@ (***********************************************************************) open Format +let default_gc = Gc.get() +let tuned_gc = { default_gc with + Gc.minor_heap_size = 32*1024*1024; + Gc.major_heap_increment = 8*1024*1024; + Gc.max_overhead = 1000000; + Gc.space_overhead = 100; +} let time f arg msg = let t1 = Unix.gettimeofday () in @@ -44,15 +51,27 @@ let restart_sequential run auto_list tree nodes () = let main () = let () = Options.parse () in + let tree_model = List.assoc !Options.tree_model + Options.supported_models + in + let module T = (val tree_model) in + let module Runtime = Run.Make(T) + in + let doc = let fd, close_fd = match !Options.input_file with None | Some "-" | Some "/dev/stdin" -> 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 + let d = time Runtime.Tree.load_xml_file fd "parsing xml document" in close_fd (); d in + let () = + Gc.full_major(); + Gc.compact(); + Gc.set (tuned_gc) + in let queries = time (fun l -> @@ -104,30 +123,29 @@ let main () = Logger.msg `STATS "@[Automaton: @\n%a@]" Ata.print auto) auto_list; end; - let module Naive = Run.Make(Naive_tree)(Naive_node_list) in let result_list = - let root = Naive_node_list.create () in - let () = Naive_node_list.add (Naive_tree.root doc) root in + let root = Runtime.ResultSet.create () in + let () = Runtime.ResultSet.add (Runtime.Tree.root doc) root in let f, msg = match !Options.parallel, !Options.compose with true, true -> - compose_parallel Naive.eval auto_list doc root, "parallel/compose" + compose_parallel Runtime.eval auto_list doc root, "parallel/compose" | true, false -> - restart_parallel Naive.full_eval auto_list doc root, "parallel/restart" + restart_parallel Runtime.full_eval auto_list doc root, "parallel/restart" | false, true -> - compose_sequential Naive.eval auto_list doc root , "sequential/compose" + compose_sequential Runtime.eval auto_list doc root , "sequential/compose" | false, false -> - restart_sequential Naive.eval auto_list doc root, "sequential/restart" + restart_sequential Runtime.eval auto_list doc root, "sequential/restart" in time f () ("evaluating query in " ^ msg ^ " mode") in - let s = Naive.stats () in + let s = Runtime.stats () in Run.( Logger.msg `STATS - "@[tree size: %d@\ntraversals: %d@\ntransition fetch cache hit ratio: %f@\ntransition eval cache hit ratio: %f@\nNumber of visited nodes per pass: %a@]" + "@[tree size: %d@\ntraversals: %d@\ntransition fetch cache miss ratio: %f@\ntransition eval cache miss ratio: %f@\nNumber of visited nodes per pass: %a@]" s.tree_size s.pass - (float s.fetch_trans_cache_hit /. float s.fetch_trans_cache_access) - (float s.eval_trans_cache_hit /. float s.eval_trans_cache_access) + (float s.fetch_trans_cache_miss /. float s.fetch_trans_cache_access) + (float s.eval_trans_cache_miss /. float s.eval_trans_cache_access) (let i = ref 0 in Pretty.print_list ~sep:"," (fun fmt n -> Format.fprintf fmt "%i: %i" !i n;incr i)) s.nodes_per_run); @@ -138,11 +156,11 @@ let main () = output_string output (string_of_int !count); output_string output "\" >\n"; if !Options.count then begin - output_string output (string_of_int (Naive_node_list.length results)); + output_string output (string_of_int (Runtime.ResultSet.length results)); output_char output '\n'; end else - Naive_node_list.iter (fun n -> - Naive_tree.print_xml output doc n; + Runtime.ResultSet.iter (fun n -> + Runtime.Tree.print_xml output doc n; output_char output '\n' ) results; output_string output "\n"; @@ -166,4 +184,6 @@ let () = 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 +(* | e -> Printexc.print_backtrace stderr; + flush stderr; + eprintf "FATAL ERROR: %s\n%!" (Printexc.to_string e); exit 128 *)