Profiling in Haskell
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.
first of all, you will need the profiling libraries for Haskell, which in Debian you can find in the
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
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.
Recompiling your projects with profiling options should be easy. Just invoke
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
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
I hope this helps you out hunting your bugs, it sure helped me a lot.flattr this!