On Fri, 16 Sep 2011 16:08:55 -0400
Alex Rubinsteyn <[email protected]> wrote:

> I ran a very simple experiment gauging the overhead of OCaml's new
> first-class modules.

This is not a valid experiment. In first two cases ocamlopt inlines
function call. Also mind that in this code ocamlopt calls the 
Local.f function directly, not through the module.

But let's correctly microbenchmark the cost of direct call vs
indirect vs message sending :)

let n = 100_000_000

let f x = x + 1
let direct () =
  let acc = ref 0 in
  for i = 0 to n do
    acc := !acc + (f 1)
  done

module type S = sig val f : int -> int end
module M = struct let f x = x + 1 end
let package = ref (module M : S)
let fstcls () =
  let acc = ref 0 in
  for i = 0 to n do
     let module Local = (val !package : S) in
     acc := !acc + (Local.f 1)
  done

let o = object method f x = x + 1 end
let obj () =
  let acc = ref 0 in
  for i = 0 to n do
     acc := !acc + o#f 1
  done

let () = 
  match Sys.argv with
  | [|_;"direct"|] -> direct ()
  | [|_;"fstcls"|] -> fstcls ()
  | [|_;"obj"|] -> obj ();
  | _ -> failwith "ORLY?"

Disable inlining :

 /opt/ocaml-3.12.1/bin/ocamlopt -inline 0 -S speed.ml -o speed

Run (Linux 3.0.0-1-686-pae i686) :

$ time ./speed direct

real    0m0.711s
user    0m0.560s
sys     0m0.012s

$ time ./speed fstcls

real    0m0.631s
user    0m0.508s
sys     0m0.000s

$ time ./speed obj

real    0m1.157s
user    0m0.840s
sys     0m0.016s

Looks like it is time to sprinkle some performance-critical code with first 
class modules :)

-- 
 ygrek
 http://ygrek.org.ua 

-- 
Caml-list mailing list.  Subscription management and archives:
https://sympa-roc.inria.fr/wws/info/caml-list
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Reply via email to