
On 19 January 2011 23:59, Evan Laforge
Another thing is that performance in logging is pretty critical. When I profile, logging functions wind up in the expensive list if I'm not careful. I don't know bad an unsafePerformIO plus a catch for every log msg is going to be, but it's not going to be as fast as doing the work at compile time.
It is possible that GHC's optimiser will let-float the "getSourceLoc assert" application to the top level, which would ensure that you only take the hit the first time. However, I'm not sure about this - do an experiment! Since logging is in IO anyway, perhaps GHC could provide a new magic primitive, (location :: IO String), which was replaced by the compiler with an expression like (return "MyLocation:42:1"). Your consumer could then look like myLogFunction location "extra-info" (myLogFunction is in IO and would deal with >>=ing in the location). This would be much less of a potential performance drag than going through exceptions. Shouldn't be too hard to patch GHC to do this, either. Cheers, Max