(* Test Platform *) open Printf let prep_data seg_len = let sixtyfour = 64 * 1024 * 1024 in (* 64 M *) let m = Bigarray.Array1.create Bigarray.char Bigarray.c_layout sixtyfour in Bigarray.Array1.fill m 'X'; let k = ref 0 in let j = ref 1 in let cnt = ref 0 in while !k < sixtyfour do m.{ !k } <- '\n'; k := !k + seg_len + !j; incr j; if !j = 100 then j := 0; incr cnt; done; printf "Number of LF chars for seg_len=%d: %d\n%!" seg_len !cnt; m let extra_work seg_len = (* This simulates some extra work that also needs to be done, in addition to line splitting *) let acc = ref 0 in for k=0 to seg_len do acc := !acc + k done let test_single_thread m seg_len = let t0 = Unix.gettimeofday() in let n = Bigarray.Array1.dim m in let k = ref 0 in let j = ref 1 in let cursor = ref 0 in while !k < n do let p = Platform.find_lf m !cursor n in assert(p = !k); cursor := p+1; k := !k + seg_len + !j; incr j; if !j = 100 then j := 0; extra_work seg_len done; let t1 = Unix.gettimeofday() in printf "Time single-threaded, segment length=%d: %.3f\n%!" seg_len (t1 -. t0) let test_worker_thread m seg_len = let open Platform.Line_splitter in let t0 = Unix.gettimeofday() in let n = Bigarray.Array1.dim m in let k = ref 0 in let j = ref 1 in let e = create m in while !k < n do let p = next_lf e in assert(p = !k); k := !k + seg_len + !j; incr j; if !j = 100 then j := 0; extra_work seg_len done; stop e; let t1 = Unix.gettimeofday() in printf "Time with worker thread, segment length=%d: %.3f\n%!" seg_len (t1 -. t0) let () = let m = prep_data 20 in test_single_thread m 20; test_worker_thread m 20; let m = prep_data 100 in test_single_thread m 100; test_worker_thread m 100; let m = prep_data 300 in test_single_thread m 300; test_worker_thread m 300; let m = prep_data 1000 in test_single_thread m 1000; test_worker_thread m 1000; let m = prep_data 3000 in test_single_thread m 3000; test_worker_thread m 3000; let m = prep_data 10000 in test_single_thread m 10000; test_worker_thread m 10000; ()