import Criterion.Main (bench, defaultMain, whnf)
import System.Environment (getArgs, withArgs)
bench_criterion benchs =
defaultMain $ map (\(name, method, input) -> bench name (whnf method input)) benchs
bench_raw benchs = do
bencharg : numreparg : _ <- getArgs
let [(_, method, input)] = filter (\(name, _, _) -> name == bencharg) benchs
numrep = read numreparg
go numrep method input
where
go !0 _ _ = return ()
go !n method input = method input `seq` go (n-1) method input
driver asc rnd = do
lenarg : args <- getArgs
let len = read lenarg
asc_list = asc len
asc_data = (asc_list, create asc_list, create (even asc_list), create (odd asc_list))
rnd_list = rnd len
rnd_data = (rnd_list, create rnd_list, create (even rnd_list), create (odd rnd_list))
benchs' = concatMap ( \(name, method) -> [(name ++ "_asc" ++ lenarg, method, asc_data),
(name ++ "_rnd" ++ lenarg, method, rnd_data)]
) benchs
case args of
"raw" : args' -> withArgs args' $ bench_raw benchs'
args' -> withArgs args' $ bench_criterion benchs'
where
even [] = []
even [_] = []
even (_:x:xs) = x : even xs
odd [] = []
odd [x] = [x]
odd (x:_:xs) = x : odd xs