on master help sign in
Speed up partialCopyM loop
216c52cBryan O'Sullivan
Data/Text/Array.hs+15−5
@@ -236,12 +236,22 @@ partialCopyM dest didx src sidx count =
236 assert (sidx + count <= length src) .
236 assert (sidx + count <= length src) .
237 assert (didx + count <= length dest) $
237 assert (didx + count <= length dest) $
238#endif
238#endif
239− copy_loop sidx didx 0
239+ if srem == 0 && drem == 0
240+ then fast_loop 0
241+ else slow_loop 0
240 where
242 where
241− copy_loop !i !j !c
243+ (swidx,srem) = sidx `divMod` wordFactor
244+ (dwidx,drem) = didx `divMod` wordFactor
245+ nwds = count `div` wordFactor
246+ fast_loop !i
247+ | i >= nwds = slow_loop (i * wordFactor)
248+ | otherwise = do w <- unsafeReadWord src (swidx+i)
249+ unsafeWriteWord dest (dwidx+i) w
250+ fast_loop (i+1)
251+ slow_loop !i
242− | c >= count = return ()
252+ | i >= count= return ()
243− | otherwise = do unsafeRead src i >>= unsafeWrite dest j
253+ | otherwise = do unsafeRead src (sidx+i) >>= unsafeWrite dest (didx+i)
244− copy_loop (i+1) (j+1) (c+1)
254+ slow_loop (i+1)
245
255
246-- | Copy some elements of an immutable array.
256-- | Copy some elements of an immutable array.
247partialCopyI :: MArray s -- ^ Destination
257partialCopyI :: MArray s -- ^ Destination