Int vs Word performance?

Don Stewart dons at galois.com
Thu Feb 26 19:28:25 EST 2009


claus.reinke:
> Looking at prelude/PrelRules.hs has reminded me of an old
> conundrum: if I switch from Int to Word, should I expect any
> performance differences?
>
> A while ago, I needed lots of fairly small positive numbers,
> together with a small number of flags for each, so I thought
> I'd switch from Int to Word, and map the flags to bits. But the 
> performance dropped so drastically that I went back
> to Int, slightly complicating the bitmaps. I didn't expect that,
> and I can't see any builtin rules for Int that would have no
> Word counterpart.
>
> Here is a trivial example with drastic difference between
> T = Int and T = Word (~2.5x here):
>
>    main = print $ foldl' (+) 0 [1..100000000::T]
>
> What am I missing here?
>
> Also, in the real code I ended up seeing things like this in
> the -ddump-simpl output for the bit-fiddling code:
>
>    GHC.Prim.word2Int#
>        (GHC.Prim.and#
>            (GHC.Prim.int2Word# wild13_XbE)
>            (GHC.Prim.int2Word# y#_a4EZ))
>
> Is that likely to cost me a lot or are these conversions cheap?

Those guys are no-ops, and in general you should never see a performance
difference. If you do, it is a bug!  There are some known cases where
rules are missing however:

  * Conversions to Int from Double for ceil, floor, round are missing rules.
            http://hackage.haskell.org/trac/ghc/ticket/2271

  * gcd only has a specialised implementation for Int,
            http://hackage.haskell.org/trac/ghc/ticket/2270

Some others I'm aware of are product/sum/maximum/minimum
on lists have specialisations for some atomic types (Int, Integer) but
not all (needs a ticket for this too).

I'm not aware of any remaining "theoretically noop" conversions that
aren't in fact implemented noops now. If you find them, please open a
ticket.

-- Don


More information about the Glasgow-haskell-users mailing list