Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: [Caml-list] Q: Profiling ocaml using gprof

85 views
Skip to first unread message

Jake Donham

unread,
Jul 15, 2008, 12:09:19 AM7/15/08
to Raj Bandyopadhyay, caml...@yquem.inria.fr
On Mon, Jul 14, 2008 at 6:52 PM, Raj Bandyopadhyay <ra...@rice.edu> wrote:
> 'camlPervasives__$5e_136'.

It's the string concatenation function (ASCII 5E is ^).

It allocates a new string and blits the two argument strings into it,
so you can probably do much better with explicit use of the Buffer
module.

Jake

_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs

Arthur Chan

unread,
Jul 15, 2008, 1:42:51 AM7/15/08
to Jake Donham, caml...@yquem.inria.fr, Raj Bandyopadhyay
Is gprof better for profiling ocaml than ocaml's own profilers?

How would you go about figuring out that that particular function stub is
string concat?

--
-----------------------------------------------------------------------
(\__/)
(='.'=)This is Bunny. Copy and paste Bunny into your
(")_(")signature to help him gain world domination.
------------------------------------------------------------------------

Vincent Hanquez

unread,
Jul 15, 2008, 3:12:15 AM7/15/08
to Jake Donham, caml...@yquem.inria.fr, Raj Bandyopadhyay
On Mon, Jul 14, 2008 at 09:09:01PM -0700, Jake Donham wrote:
> On Mon, Jul 14, 2008 at 6:52 PM, Raj Bandyopadhyay <ra...@rice.edu> wrote:
> > 'camlPervasives__$5e_136'.
>
> It's the string concatenation function (ASCII 5E is ^).
>
> It allocates a new string and blits the two argument strings into it,
> so you can probably do much better with explicit use of the Buffer
> module.

or the explicit String.concat that can account for multiple
concatenations in one go (allocate once, and blit everything).

--
Vincent

Richard Jones

unread,
Jul 15, 2008, 5:12:38 AM7/15/08
to Arthur Chan, caml...@yquem.inria.fr, Raj Bandyopadhyay
On Mon, Jul 14, 2008 at 10:42:39PM -0700, Arthur Chan wrote:
> Is gprof better for profiling ocaml than ocaml's own profilers?

They are slightly different. I use 'gprof' all the time because I
tend to only use natively compiled executables. 'gprof' is the
ordinary GNU profiling tool that tells you which function is being run
most often and some limited information about the call path into that
function. It's pretty useful for simple profiling where you're
looking for obvious problems.

'ocamlprof' is a bit different. Last time I used it [which was a few
years ago, so maybe it's different now], it only worked on bytecode.
It outputs your original code with annotations telling you how often
each expression was run. So this isn't time taken (each expression
can take a different amount of time to execute, and this time isn't
shown), but how often a particular path through the code is taken.

> How would you go about figuring out that that particular function stub is
> string concat?

> 'camlPervasives__$5e_136'.

In 'gprof' there's a simple name mangling used to map OCaml function
names to assembler symbols. Once you understand it, you'll find it
easy to follow. First of all note that OCaml function names aren't
unique, eg in the following code:

let f () = printf "this is the first f()\n"
let f () = printf "this is the second f()\n"; f () ;;

f ()

The assembler symbol is:

"caml" ^ Modulename ^ "__" ^ functionname ^ "_" ^ uniquenumber

'uniquenumber' is just a counter added to function names by the
compiler to make sure that functions which have the same name will
have different symbols.

So when I compiled the code above in a file called 'test.ml' (hence a
module called Test), in my case I ended up with two symbols called:

camlTest__f_77
camlTest__f_78

where '77' and '78' are arbitrary. You can check this by looking at
the assembler output from the compiler (ocamlopt -S).

If a function name contains an operator symbol (eg. (^) ) then a $xx
hex code is used.

I guess in theory one could write an OCaml symbol filter, similar to
c++filt [http://sourceware.org/binutils/docs/binutils/c_002b_002bfilt.html]

Rich.

--
Richard Jones
Red Hat

0 new messages