module Main where -- ghc -prof -auto-all --make -O2 ArrayCopyGetBounds.hs import Control.Monad( when ) import Data.Array.IO import Data.Int --import System.Random type Arr = IOUArray Int Int64 main = do -- rg <- getStdGen let size = 50000 nCopies = 10000 -- vs = map fromIntegral (randoms rg :: [Int]) a1 <- newTempArray size a2 <- newTempArray size doN nCopies (a1 `copyInto` a2) newTempArray :: Int -> IO Arr newTempArray len = newArray (0, len-1) 0 copyInto :: Arr -> Arr -> IO () copyInto c l = getBounds c >>= uncurry blit where blit i end = when (i <= end) (do ith <- readArray c i writeArray l i ith blit (i+1) end) doN n act = go n where go i = when (i > 0) (act >> go (i-1))