From: Christophe Raffalli <raffalli@cs.chalmers.se>
To: caml-list@pauillac.inria.fr
Subject: A (tiny) time-profiler for Caml-Light
Date: Fri, 3 Nov 1995 16:41:59 +0100 (MET) [thread overview]
Message-ID: <199511031541.QAA23262@lips.cs.chalmers.se> (raw)
I wrote a simple tool to profile programs, it might be usefull to others....
try it out.
Furthermore if anyone knowns how to put is inside the compiler ....
------------------- cut here ------------------
(* This program is a small time-profiler for Caml-Light *)
(* It requires the UNIX library *)
(* To use it, link it with the program you want to profile (don not forget
"-lunix -custom unix.zo" among the link options).
To trace a function "f" with ONE argument add the following just after the
definition of "f":
let f = profile "f" f;;
(the string is used to print the profile infomation).
If f has two arguments do the same with profile2, idem with 3 and
4. For more than 4 arguments ... modify the function profile yourself,
it is very easy (look the differences between profile and profile2.
If you want to profile two mutually recursive functions, you had better
to rename them :
let f' = .... f' ... g'
and g' = .... f' .... g'
;;
let f = profile "f" f';;
let g = profile "f" g';;
Before the program quits, you should call "print_profile ();;". It
produces a result of the following kind:
f 5.32 7.10
g 4.00 4.00
main 0.12 9.44
total -9.44 0.00
- The first column is the name of the function.
- The third column give the time (utime + stime) spend inside the function.
- The second column give the time spend inside the function minus the
time spend in other profiled functions called by it
The last line can be ignored (there is a bug if the down-right digit is non
zero)
*)
let tot_ptr = ref 0.0 and tot_ptr' = ref 0.0;;
let prof_table = ref ["total",tot_ptr,tot_ptr'];;
let stack = ref [tot_ptr'];;
let print_profile () =
print_newline ();
let l = sort__sort (fun (_,_,p) (_,_,p') -> !p >. !p') !prof_table in
do_list (fun (name,ptr,ptr') ->
printf__printf "%-20s %8.2f %8.2f\n" name !ptr' !ptr) l
;;
let profile name f =
let ptr = ref 0.0 and ptr' = ref 0.0 in
prof_table := (name,ptr,ptr')::!prof_table;
(fun x ->
let {unix__tms_utime = ut;unix__tms_stime = st} = unix__times () in
stack := ptr'::!stack;
try
let r = f x in
let {unix__tms_utime = ut';unix__tms_stime = st'} = unix__times () in
let t = (ut' -. ut) +. (st' -. st) in
(match !stack with
_::(ptr'::_ as s) -> stack:=s; ptr' := !ptr' -. t
| _ -> failwith "bug in profile");
ptr := !ptr +. t;
ptr' := !ptr' +. t;
r
with e ->
let {unix__tms_utime = ut';unix__tms_stime = st'} = unix__times () in
let t = (ut' -. ut) +. (st' -. st) in
(match !stack with
_::(ptr'::_ as s) -> stack:=s; ptr' := !ptr' -. t
| _ -> failwith "bug in profile");
ptr := !ptr +. t;
ptr' := !ptr' +. t;
raise e
)
;;
let profile2 name f =
let ptr = ref 0.0 and ptr' = ref 0.0 in
prof_table := (name,ptr,ptr')::!prof_table;
(fun x y ->
let {unix__tms_utime = ut;unix__tms_stime = st} = unix__times () in
stack := ptr'::!stack;
try
let r = f x y in
let {unix__tms_utime = ut';unix__tms_stime = st'} = unix__times () in
let t = (ut' -. ut) +. (st' -. st) in
(match !stack with
_::(ptr'::_ as s) -> stack:=s; ptr' := !ptr' -. t
| _ -> failwith "bug in profile");
ptr := !ptr +. t;
ptr' := !ptr' +. t;
r
with e ->
let {unix__tms_utime = ut';unix__tms_stime = st'} = unix__times () in
let t = (ut' -. ut) +. (st' -. st) in
(match !stack with
_::(ptr'::_ as s) -> stack:=s; ptr' := !ptr' -. t
| _ -> failwith "bug in profile");
ptr := !ptr +. t;
ptr' := !ptr' +. t;
raise e
)
;;
let profile3 name f =
let ptr = ref 0.0 and ptr' = ref 0.0 in
prof_table := (name,ptr,ptr')::!prof_table;
(fun x y z ->
let {unix__tms_utime = ut;unix__tms_stime = st} = unix__times () in
stack := ptr'::!stack;
try
let r = f x y z in
let {unix__tms_utime = ut';unix__tms_stime = st'} = unix__times () in
let t = (ut' -. ut) +. (st' -. st) in
(match !stack with
_::(ptr'::_ as s) -> stack:=s; ptr' := !ptr' -. t
| _ -> failwith "bug in profile");
ptr := !ptr +. t;
ptr' := !ptr' +. t;
r
with e ->
let {unix__tms_utime = ut';unix__tms_stime = st'} = unix__times () in
let t = (ut' -. ut) +. (st' -. st) in
(match !stack with
_::(ptr'::_ as s) -> stack:=s; ptr' := !ptr' -. t
| _ -> failwith "bug in profile");
ptr := !ptr +. t;
ptr' := !ptr' +. t;
raise e
)
;;
let profile4 name f =
let ptr = ref 0.0 and ptr' = ref 0.0 in
prof_table := (name,ptr,ptr')::!prof_table;
(fun x y z t ->
let {unix__tms_utime = ut;unix__tms_stime = st} = unix__times () in
stack := ptr'::!stack;
try
let r = f x y z t in
let {unix__tms_utime = ut';unix__tms_stime = st'} = unix__times () in
let t = (ut' -. ut) +. (st' -. st) in
(match !stack with
_::(ptr'::_ as s) -> stack:=s; ptr' := !ptr' -. t
| _ -> failwith "bug in profile");
ptr := !ptr +. t;
ptr' := !ptr' +. t;
r
with e ->
let {unix__tms_utime = ut';unix__tms_stime = st'} = unix__times () in
let t = (ut' -. ut) +. (st' -. st) in
(match !stack with
_::(ptr'::_ as s) -> stack:=s; ptr' := !ptr' -. t
| _ -> failwith "bug in profile");
ptr := !ptr +. t;
ptr' := !ptr' +. t;
raise e
)
;;
------------------- cut here ------------------
----
Christophe Raffalli
Dept. of Computer Sciences
Chalmers University of Technology
URL: http://www.logique.jussieu.fr/www.raffalli
reply other threads:[~1995-11-06 8:37 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=199511031541.QAA23262@lips.cs.chalmers.se \
--to=raffalli@cs.chalmers.se \
--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