{-# LANGUAGE BangPatterns #-} module Main where import Control.DeepSeq import Control.Exception (evaluate) import Control.Monad.Trans (liftIO) import Criterion.Config import Criterion.Main import Data.List (foldl') import qualified Data.Map as M import qualified Map_FindGE as M import Data.Maybe (fromMaybe) import Prelude hiding (lookup) main = do defaultMainWith defaultConfig (liftIO . evaluate $ rnf [m_even, m_odd, m_large]) ([b f | b <- benches, f <- funs1] ++ [b f | b <- benches, f <- funs2]) where m_even = M.fromAscList elems_even :: M.Map Int Int m_odd = M.fromAscList elems_odd :: M.Map Int Int m_large = M.fromAscList elems_large :: M.Map Int Int bound = 2^10 elems_even = zip evens evens elems_odd = zip odds odds elems_large = zip large large evens = [2,4..bound] odds = [1,3..bound] large = [1,100..50*bound] benches = [ \(n,fun) -> bench (n++" present") $ nf (fge fun evens) m_even , \(n,fun) -> bench (n++" absent") $ nf (fge fun evens) m_odd , \(n,fun) -> bench (n++" far") $ nf (fge fun odds) m_large , \(n,fun) -> bench (n++" !present") $ nf (fge2 fun evens) m_even , \(n,fun) -> bench (n++" !absent") $ nf (fge2 fun evens) m_odd , \(n,fun) -> bench (n++" !far") $ nf (fge2 fun odds) m_large ] funs1 = [("GE split",M.findGreaterEqual1) ,("GE caseof",M.findGreaterEqual2) ,("GE default",M.findGreaterEqual3)] funs2 = [("GT split",M.findGreater1) ,("GT default",M.findGreater3)] fge :: (Int -> M.Map Int Int -> Maybe (Int,Int)) -> [Int] -> M.Map Int Int -> (Int,Int) fge fun xs m = foldl' (\n k -> fromMaybe n (fun k m)) (0,0) xs -- forcing values inside tuples! fge2 :: (Int -> M.Map Int Int -> Maybe (Int,Int)) -> [Int] -> M.Map Int Int -> (Int,Int) fge2 fun xs m = foldl' (\n@(!a,!b) k -> fromMaybe n (fun k m)) (0,0) xs