Nek0's Blog

Profiling in Haskell

Posted on by nek0 in programming, english

On of my projects is a game engine called “Affection”. Its design is loosely based on the game engine “Löve” for Lua.

Because I have been doing it a lot recently in this project, I would like to make public the method of profiling I use.

Prerequisites

first of all, you will need the profiling libraries for Haskell, which in Debian you can find in the ghc-prof package.

Next you need to enable profiling in your build environment. You can do this either globally or per-package. If you want to enable it globally, you just need to add

profiling: True

to your ~/.cabal/config file.

If you want to enable it per-package, you need to add the same line to a cabal.config in your projects root directory (The same directory your *.cabal file is located.

When enabling profiling, it might happen, that you need to reinstall a whole lot of packages. Sandboxing your project might be a good idea.

Compiling

Recompiling your projects with profiling options should be easy. Just invoke cabal build.

Profiling

After your build succeeded, you can start profiling your executables by

path/to/executable +RTS -hc

Your executable will run as expected, you can try it out and everything. When your application terminates, it produces an file ending with .hp, containing your profiling information. Its content is rather cryptic, but that doesn’t matter. There are tools even for that. You can try running

hp2ps -c executable.hp

where executable is the name of your executable. This produces a .ps file, a simple postscript file, that you can open with your PDF-viewer. You will see a graph showing memory allocation per function, which might lead you to memory leaks or similar problems.

If you want to profile your executable by datatype memory allocation, just run the profiling command (the one with the +RTS) and write -hy instead of -hc .

I hope this helps you out hunting your bugs, it sure helped me a lot.

flattr this!

If you see this, something is wrong