{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
module Main (main) where
import Criterion.Main (bench, bgroup, defaultMain, nf)
import qualified Data.Foldable as F
import qualified Data.HashMap.Lazy as HM
import qualified Data.Map as Map
import qualified Data.Sequence as Seq
import qualified Data.Vector as V
import Data.Foldable.WithIndex
import Data.Functor.WithIndex.Instances ()
main :: IO ()
main = defaultMain
[ bgroup "vector"
[ bgroup "itoList"
[ bench "native" $ nf (V.toList . V.indexed) v
, bench "itoList" $ nf itoList v
]
]
#if MIN_VERSION_containers(0,5,0)
, bgroup "sequence"
[ bgroup "itoList"
[ bench "native" $ nf (F.toList . Seq.mapWithIndex (,)) s
, bench "itoList" $ nf itoList s
]
]
#endif
, bgroup "list"
[ bgroup "itoList"
[ bench "native" $ nf (zip [(0::Int)..]) l
, bench "itoList" $ nf itoList l
]
]
, bgroup "map"
[ bgroup "itoList"
[ bench "native" $ nf Map.toList m
, bench "itoList" $ nf itoList m
]
]
, bgroup "hashmap"
[ bgroup "itoList"
[ bench "native" $ nf HM.toList h
, bench "itoList" $ nf itoList h
]
]
]
l :: [Int]
l = [0..10000]
{-# NOINLINE l #-}
h :: HM.HashMap Int Int
h = HM.fromList $ zip l l
{-# NOINLINE h #-}
m :: Map.Map Int Int
m = Map.fromList $ zip l l
{-# NOINLINE m #-}
s :: Seq.Seq Int
s = Seq.fromList l
{-# NOINLINE s #-}
v :: V.Vector Int
v = V.fromList l
{-# NOINLINE v #-}