open Printf let rep = 3 let gen_cmd = "./gensplit" let pgms = [ (* "split.galax.xq"; "split2.galax.xq"; "split3.galax.xq"; *) (*"split.xst"; "split2.xst"; "split3.xst";*) "split4.xst"; (*"split.cd";*) "split2.cd"; "split.saxon.xq"; (*"split2.saxon.xq"; "split3.saxon.xq";*) (*"split.qizx.xq"; "split2.qizx.xq";*) "split3.qizx.xq"; "split1.xsltc.xsl"; (*"split2.xsltc.xsl";*) "split1.saxon.xsl"; (*"split2.saxon.xsl";*) "split1.xsltproc.xsl"; (*"split2.xsltproc.xsl";*) "split1.xalan.xsl"; (*"split2.xalan.xsl";*) ] let sizes = [ 250 ; 500; 1000; 2000; 4000; 8000; 16000; 32000; 64000 ] exception Error let cmd s = if (Sys.command s != 0) then raise Error let gen i = let f = sprintf "split%i.xml" i in if not (Sys.file_exists f) then ( eprintf "Generating %s\n" f; flush stderr; cmd (sprintf "%s %i > %s" gen_cmd i f) ); let s = (Unix.stat f).Unix.st_size in s / 1024 / 1024, f let pr = printf let gt = Unix.gettimeofday let measure s = let t = gt() in cmd (sprintf "%s > /dev/null 2>> log" s); gt () -. t let time i s = try let a = ref 0. and g = ref 1. in for i = 1 to rep do let t = measure s in a := !a +. t; g := !g *. t; done; let m = (!g ** (1. /. (float_of_int rep))) in (* (!a /. (float_of_int rep)) *) let m = (float_of_int i) /. m in printf "%5.2f " m; flush stdout with Error -> printf "*ERR* "; flush stdout let xstream pgm = cmd (Printf.sprintf "../xstream -concat -o %s.exe %s" pgm pgm); fun xml -> Printf.sprintf "./%s.exe %s" pgm xml let xsltproc pgm xml = Printf.sprintf "xsltproc %s %s" pgm xml let cduce pgm = cmd (Printf.sprintf "~/cduce/cduce -c %s" pgm); fun xml -> Printf.sprintf "~/cduce/cduce --run %so --arg %s" pgm xml let saxon_xq pgm xml = Printf.sprintf "./saxon_xquery -pull -s %s %s" xml pgm let saxon_xsl pgm xml = Printf.sprintf "./saxon_xslt %s %s" xml pgm let qizx pgm xml = Printf.sprintf "./qizx -input %s -q %s" xml pgm let xsltc pgm = let classfile = String.sub pgm 0 (String.index pgm '.') in cmd (Printf.sprintf "./xsltc_compile -o %s %s" classfile pgm); fun xml -> Printf.sprintf "./xsltc_run %s %s" xml classfile let xalan pgm xml = Printf.sprintf "xalan -in %s -xsl %s" xml pgm let galax pgm xml = Printf.sprintf "galax-run -context-item %s %s" xml pgm let tools = [ "xsltproc.xsl", xsltproc; "saxon.xsl", saxon_xsl; "xalan.xsl", xalan; "xsltc.xsl", xsltc; "xst", xstream; "cd", cduce; "saxon.xq", saxon_xq; "qizx.xq", qizx; "galax.xq", galax; ] let xmls = List.map gen sizes let () = printf "%20s " ""; List.iter (fun (i,_) -> printf "%3iMb " i) xmls; printf "\n"; List.iter (fun pgm -> let (_,tool) = try List.find (fun (ext,tool) -> Filename.check_suffix pgm ext) tools with Not_found -> failwith pgm in let f = tool pgm in printf "%20s: " pgm; flush stdout; List.iter (fun (i,xml) -> time i (f xml)) xmls; printf "\n" ) pgms