Plasma GitLab Archive
Projects Blog Knowledge

(* 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;

  ()

This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml