[Haskell-cafe] Re: Array performance is killing me

Joel Reymont joelr1 at gmail.com
Tue Dec 20 05:16:31 EST 2005


Converting to Ptr Word8 and storables took about an hour and gave me  
a more favorable profile.

COST CENTRE                    MODULE               %time %alloc
reverse_                       Script.Endian         14.4   13.4
sequ                           Script.Pickle         14.3    9.3
read                           Script.PokerClient    10.9    9.1
storable                       Script.Pickle         10.8   10.7
timestamp                      Script.Trace           7.1    3.8
dispatch                       Script.Engine          6.3    4.3
unstuff                        Script.PokerClient     4.4    2.9
appU_wstr                      Script.Endian          4.4    3.2
trace_                         Script.Trace           3.9    1.2
readQ                          Script.Queue           3.3   13.0
lift                           Script.Pickle          2.9    5.3
writeQ                         Script.Queue           2.8    2.7
wrap                           Script.Pickle          2.2    1.2
$!!                            Script.DeepSeq         1.8    0.5
puTableInfo                    Script.PicklePlus      1.7    2.6
puCommand                      Script.PickleCmd       1.1    0.1
fetch                          Script.Engine          0.9   11.6
post_                          Script.Engine          0.2    1.7

Any suggestions on how to optimize reverseBytes below? Would  
specializing it help?

isBigEndian :: Bool
isBigEndian = $(lift $ (1::CChar) /= (unsafePerformIO
                                      $ with (1::CInt)
                                      $ peekByteOff `flip` 0) ) :: Bool

reverse_ :: (Storable a, Endian a) => a -> a
reverse_ a =
     if isBigEndian
        then reverseBytes a
        else a

--- Endian conversion

class (Bits a, Integral a, Num a) => Endian a where
     reverseBytes :: a -> a

instance Endian Word16 where
     reverseBytes v = (v `shiftR` 8) + ((v .&. 0xFF) `shiftL` 8)

instance Endian Int16 where
     reverseBytes v = (v `shiftR` 8) + ((v .&. 0xFF) `shiftL` 8)

instance Endian Word32 where
     reverseBytes v = ( v                 `shiftR` 24) +
                 ((v .&. 0x000000FF) `shiftL` 24) +
                 ((v .&. 0x0000FF00) `shiftL` 8) +
                 ((v .&. 0x00FF0000) `shiftR` 8)

instance Endian Int32 where
     reverseBytes v = ( v                 `shiftR` 24) +
                 ((v .&. 0x000000FF) `shiftL` 24) +
                 ((v .&. 0x0000FF00) `shiftL` 8) +
                 ((v .&. 0x00FF0000) `shiftR` 8)

instance Endian Word64 where
     reverseBytes v = ( v                         `shiftR` 56) +
                 ((v .&. 0x00000000000000FF) `shiftL` 56) +
                 ((v .&. 0x00FF000000000000) `shiftR` 40) +
                 ((v .&. 0x000000000000FF00) `shiftL` 40) +
                 ((v .&. 0x0000FF0000000000) `shiftR` 24) +
                 ((v .&. 0x0000000000FF0000) `shiftL` 24) +
                 ((v .&. 0x000000FF00000000) `shiftR` 8) +
                 ((v .&. 0x00000000FF000000) `shiftL` 8)

--
http://wagerlabs.com/







More information about the Haskell-Cafe mailing list