{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE RankNTypes #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Main (main) where
import Criterion.Main (bench, bgroup, defaultMain, nf)
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.Functor.WithIndex (imap)
import Data.Functor.WithIndex.Instances ()
import Data.Traversable.WithIndex (imapDefault)
main :: IO ()
main = defaultMain
[ bgroup "vector"
[ bgroup "imap"
[ bench "native" $ nf (V.imap (\i x -> x + i + 100)) v
, bench "imap" $ nf (imap (\i x -> x + i + 100)) v
, bench "default" $ nf (imapDefault (\i x -> x + i + 100)) v
]
]
#if MIN_VERSION_containers(0,5,0)
, bgroup "sequence"
[ bgroup "imap"
[ bench "native" $ nf (Seq.mapWithIndex (\i x -> x + i + 100)) s
, bench "imap" $ nf (imap (\i x -> x + i + 100)) s
, bench "default" $ nf (imapDefault (\i x -> x + i + 100)) s
]
]
#endif
, bgroup "list"
[ bgroup "imap"
[ bench "native" $ nf (zipWith (\i x -> x + i + 100) [0..]) l
, bench "imap" $ nf (imap (\i x -> x + i + 100)) l
, bench "default" $ nf (imapDefault (\i x -> x + i + 100)) l
]
]
, bgroup "map"
[ bgroup "imap"
[ bench "native" $ nf (Map.mapWithKey (\i x -> x + i + 100)) m
, bench "imap" $ nf (imap (\i x -> x + i + 100)) m
, bench "default" $ nf (imapDefault (\i x -> x + i + 100)) m
]
]
, bgroup "hashmap"
[ bgroup "imap"
[ bench "native" $ nf (HM.mapWithKey (\i x -> x + i + 100)) h
, bench "imap" $ nf (imap (\i x -> x + i + 100)) h
, bench "default" $ nf (imapDefault (\i x -> x + i + 100)) 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 #-}