
On Mon, Jun 18, 2007 at 11:55:05AM +1000, Thomas Conway wrote:
Hi All,
I'm trying to figure out how to maximum performance out of one of my inner loops which involves string hashing.
Consider the following hash function, which is a transliteration of a good one written in C: [ Code elided ] Obviously, we'd like all those lambdas and composes to be inlined, along with all the intermediate Triple structures. So, how do you convince ghc to do this? Alternatively, how would you *translate* rather than transliterate, the mix function?
Just pass the -O option to GHC. (-O2 for better results). On my system there are no lambdas or (.) left, as confirmed with -ddump-simpl. However, GHC's 64 bit type is implemented using full foreign calls (and thus rather expensive...) on 32 bit systems! So if possible don't do that. Also, GHC produces this type signature for $wmix: HashStr.$wmix :: GHC.Word.Word64 -> GHC.Prim.Word64# -> GHC.Prim.Word64# -> HashStr.Triple That is, the unboxing is incomplete. This is very very fishy; I'm submitting a bug. Stefan