[Haskell-cafe] [Fwd: profiling in haskell]

Tim Chevalier catamorphism at gmail.com
Wed Sep 10 15:42:12 EDT 2008

On Wed, Sep 10, 2008 at 12:31 PM, Vlad Skvortsov <vss at 73rus.com> wrote:
> Hmm, that's a good point! I didn't think about it. Though how do I make GHC
> link in profiling versions of standard libraries? My own libraries are built
> with profiling support and I run Setup.hs with --enable-library-profiling
> and --enable-executable-profiling options.

When you build your own code with -prof, GHC automatically links in
profiling versions of the standard libraries. However, its profiling
libraries were not built with -auto-all (the reason is that adding
cost centres interferes with optimization). To build the libraries
with -auto-all, you would need to build GHC from sources, which is not
for the faint of heart. However, the results of doing that aren't
usually very enlightening anyway -- for example, foldr might be called
from many different places, but you might only care about a single
call site (and then you can annotate that call site).

Just from looking, I would guess this is the culprit:

>   termToStr t il =
>     {-# SCC "termToStr" #-} ((:) ("t " ++ t ++ " " ++ (foldl ilItemToStr ""
> il)))

If you want to be really sure, you can rewrite this as:

 termToStr t il =
     {-# SCC "termToStr" #-} ((:) ("t " ++ t ++ " " ++ ({-# SCC
"termToStr_foldl" #-} foldl ilItemToStr ""

and that will give you a cost centre measuring the specific cost of
the invocation of foldl.

> Data.Map.foldWith key is implemented with foldr[1], however I'm not sure I'm
> getting how foldr is superior to foldl here (foldl' I understand). Could you
> shed some light on that for me please?

I meant the call to foldl in termToStr. There's a good explanation of this at:
(look for "foldl").


Tim Chevalier * http://cs.pdx.edu/~tjc * Often in error, never in doubt
Just enough: Obama/Biden '08.

More information about the Haskell-Cafe mailing list