From: Mark Hayden <hayden@cs.cornell.edu>
To: caml-list@pauillac.inria.fr
Cc: hayden@cs.cornell.edu
Subject: an ocaml performance test
Date: Thu, 4 Jul 1996 02:55:45 -0400 [thread overview]
Message-ID: <199607040655.CAA13173@verdandi.cs.cornell.edu> (raw)
Several months back I asked this mailing list
if anyone had any tests for gauging the
performance of basic operations in ocaml. I got
some responses, but no data, so I put together a
test program, which I'm posting for others who
might be interested. The tests are intended to
give a sense of relative costs of similar
operations within ocaml. The output was
gathered by running the program on a
sparcstation 10 from Ocaml 1.01, compiled with
the "ocamlopt -unsafe".
The numbers in the table are meaningless on
their own. The test program below should also
be examined to see exactly what is being
measured.
Many of the tests are straightforward to
interpret. For example, it appears that
scanning an array with Array.iter is
considerably slow than with a for loop. I'm not
sure, however, how to interpret the tests
measuring the performance of function
application to various kinds of closures (marked
"partial" in the table). I have some guesses,
but I would appreciate an explanation from
someone who knows what is going on.
thanks, Mark Hayden
OUTPUT
null : 000.2958 usec
1 arg : 000.0782 usec
2 arg : 000.0978 usec
3 arg : 000.1236 usec
partial : 000.2286 usec
partial(a) : 000.2326 usec
partial(b) : 000.2247 usec
partial(c) : 000.0899 usec
magic : -00.0032 usec
let : -00.0001 usec
succ : 000.0140 usec
hashtbl:int : 002.5633 usec
array:for:0000 : 000.1085 usec
Array.iter:let:0000 : 000.3845 usec
Array.iter:fun:0000 : 000.8096 usec
array:for:0010 : 000.7928 usec
Array.iter:let:0010 : 004.7812 usec
Array.iter:fun:0010 : 005.4675 usec
array:vect:1000 : 090.7683 usec
Array.iter:let:1000 : 440.9373 usec
Array.iter:fun:1000 : 453.8632 usec
let rec list:1000 : 100.0212 usec
List.iter:let:1000 : 307.8812 usec
List.iter:fun:1000 : 312.9682 usec
gettimeofday : 011.4198 usec
select : 118.0977 usec
TESTPERF.ML:
open Printf
let i a = a
let v0 = Array.create 0 ()
let v10 = Array.create 10 ()
let v1000 = Array.create 1000 ()
let l1000 = Array.to_list v1000
let f1 a = a
let f2 a b = a
let f3 a b c = a
let f2a = fun () -> fun () -> ()
let f2b = fun a -> fun b -> a
let f2c = fun a -> let c = () in fun b -> a
let f2p = f2 ()
let f2pa = f2a ()
let f2pb = f2b ()
let f2pc = f2c ()
let h = Hashtbl.create 10
let hi = 234
let hv = 123
let _ = Hashtbl.add h hi hv
let zero = 0.0
let tests = [
1E7, "null", i ;
1E6, "1 arg",
(fun () -> f1 ()) ;
1E6, "2 arg",
(fun () -> f2 () ()) ;
1E6, "3 arg",
(fun () -> f3 () () ()) ;
1E6, "partial",
(fun () -> f2p ()) ;
1E6, "partial(a)",
(fun () -> f2pa ()) ;
1E6, "partial(b)",
(fun () -> f2pb ()) ;
1E6, "partial(c)",
(fun () -> f2pc ()) ;
1E6, "magic",
(fun () -> Obj.magic (Obj.repr ())) ;
1E6, "let",
(fun () -> let a = () in a) ;
1E6, "succ",
(fun () -> succ 5 ; ()) ;
1E5, "hashtbl:int",
(fun () -> Hashtbl.find h hi ; ()) ;
1E5, "array:for:0000",
(fun () -> for i = 0 to pred (Array.length v0) do () done) ;
1E5, "Array.iter:let:0000",
(fun () -> Array.iter i v0) ;
1E5, "Array.iter:fun:0000",
(fun () -> Array.iter (fun a -> a) v0) ;
1E4, "array:for:0010",
(fun () -> for i = 0 to pred (Array.length v10) do () done) ;
1E4, "Array.iter:let:0010",
(fun () -> Array.iter i v10) ;
1E4, "Array.iter:fun:0010",
(fun () -> Array.iter (fun a -> a) v10) ;
1E3, "array:for:1000",
(fun () -> for i = 0 to pred (Array.length v1000) do () done) ;
1E3, "Array.iter:let:1000",
(fun () -> Array.iter i v1000) ;
1E3, "Array.iter:fun:1000",
(fun () -> Array.iter (fun a -> a) v1000) ;
1E3, "let rec list:1000",
(fun () -> let rec loop = function [] -> () | hd::tl -> loop tl in loop l1000) ;
1E3, "List.iter:let:1000",
(fun () -> List.iter i l1000) ;
1E3, "List.iter:fun:1000",
(fun () -> List.iter (fun a -> a) l1000) ;
1E4, "gettimeofday",
(fun () -> Unix.gettimeofday () ; ()) ;
1E4, "select",
(fun () -> Unix.select [] [] [] zero ; ())
]
let ntests = 1000
let run () =
let adjust = ref 0.0 in
List.iter (fun (ntests,name,f) ->
let ntests = truncate ntests in
let start = Unix.gettimeofday () in
for i = 1 to ntests do f () done ;
let stop = Unix.gettimeofday () in
let time = ((stop -. start) /. (float ntests)) *. 1000000.0 in
printf "%30s : %08.4f usec\n" name (time -. !adjust) ;
flush stdout ;
if name = "null" then (
adjust := time ;
printf "\n"
)
) tests
let _ = run ()
COMPILE
testperf: testperf.ml
ocamlopt -unsafe -o testperf unix.cmxa testperf.ml -cclib -lunix
reply other threads:[~1996-07-05 16:06 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=199607040655.CAA13173@verdandi.cs.cornell.edu \
--to=hayden@cs.cornell.edu \
--cc=caml-list@pauillac.inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox