{-# LANGUAGE BangPatterns #-} import Control.Monad import qualified Data.Vector.Unboxed as UV import Criterion.Main import Criterion.Config import Control.Monad.Random import Data.RangeMin {-# NOINLINE bencher #-} bencher :: UV.Vector Int -> IO Benchmark bencher xs = do zs <- UV.replicateM 1 $ do i0 <- getRandomR (0, n-1) j0 <- getRandomR (0, n-1) let i = min i0 j0 let j = max i0 j0 - i + 1 i `seq` j `seq` return (i, j) return $ bench (show (UV.length xs)) $ whnf (\ ys -> let !rM = myGenRM ys in UV.foldr (\ (i, m) -> seq (rM i m)) () zs) xs where n = UV.length xs {-# NOINLINE myGenRM #-} myGenRM :: UV.Vector Int -> Int -> Int -> Int myGenRM xs = vecRangeMin xs benches :: IO [Benchmark] benches = forM (map (5^) [9::Int]) $ \ n -> do xs <- liftM UV.fromList $ replicateM n getRandom bencher $! xs main = defaultMainWith defaultConfig{cfgPerformGC = ljust True, cfgSamples = ljust 30, cfgResamples = ljust 20000} (return ()) =<< benches