packages feed

structures-0.1: benchmarks/maps.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
module Main where

import Control.Monad (join)
import Criterion.Config
import Criterion.Main
import qualified Data.Map as M
import qualified Data.Vector.Map as V
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Generic.Mutable as GM
import System.Random.MWC (withSystemRandom, GenIO, Variate(..))

randVec :: (U.Unbox a, Variate a) => Int -> GenIO -> IO (U.Vector a)
randVec n g = GM.replicateM n (uniform g) >>= G.unsafeFreeze

randVecStd :: (U.Unbox a, Variate a) => Int -> IO (U.Vector a)
randVecStd = withSystemRandom . randVec

insertAll :: U.Unbox a => (a -> a -> t -> t) -> t -> U.Vector a -> t
insertAll f e = U.foldl' (flip $ join f) e

sumAll :: (U.Unbox a, U.Unbox b, Num b) => (a -> b) -> U.Vector a -> b
sumAll f = U.sum . U.map f

main :: IO ()
main = do
  ns <- randVecStd 1000 :: IO (U.Vector Int)
  -- print (vinsert ns)
  -- print (V.shape (vinsert ns))
  putStrLn $ if sumAll (vget (vinsert ns)) ns == sumAll (minsert ns M.!) ns
             then "We are sane"
             else "We are insane, man!"
  defaultMainWith defaultConfig { cfgSamples = ljust 10 } (return ())
    [ bench "Map insertion"  $ whnf minsert ns
    , bench "VMap insertion" $ whnf vinsert ns
    , bench "map sum"        $ whnf (sumAll (minsert ns M.!)) ns
    , bench "vmap sum"       $ whnf (sumAll (vget (vinsert ns))) ns
    ]
 where
  minsert = insertAll M.insert M.empty
  vinsert = insertAll V.insert V.empty
  vget m k = case V.lookup k m of
    Nothing -> error $ "Missing "++show k
    Just x -> x