on 2df2fcd help sign in
typerep-map/benchmark/CacheMap.hs
52 lines 1.7 kB history raw
1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE ExplicitNamespaces #-}
3{-# LANGUAGE KindSignatures #-}
4{-# LANGUAGE PolyKinds #-}
5{-# LANGUAGE TypeFamilies #-}
6{-# LANGUAGE TypeOperators #-}
7{-# LANGUAGE UndecidableInstances #-}
9{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-}
11module CacheMap
12 ( benchCacheMap
13 ) where
15import Criterion.Main (Benchmark, bench, bgroup, nf)
17import Prelude hiding (lookup)
19import Data.Maybe (fromJust)
20import Data.Proxy (Proxy (..))
21import Data.Typeable (Typeable)
22import GHC.TypeLits
24import Data.TypeRepMap.Internal (TF (..), TypeRepMap (..), fromList, lookup)
26benchCacheMap :: Benchmark
27benchCacheMap = bgroup "vector optimal cache"
28 [ bench "lookup" $ nf tenLookups bigMap
29 -- , bench "insert new" $ whnf (\x -> rknf $ insert x bigMap) (Proxy :: Proxy 9999999999)
30 -- , bench "update old" $ whnf (\x -> rknf $ insert x bigMap) (Proxy :: Proxy 1)
31 ]
33tenLookups :: TypeRepMap (Proxy :: Nat -> *)
34 -> ( Proxy 10, Proxy 20, Proxy 30, Proxy 40
35 , Proxy 50, Proxy 60, Proxy 70, Proxy 80
36 )
37tenLookups tmap = (lp, lp, lp, lp, lp, lp, lp, lp)
38 where
39 lp :: forall (a::Nat). Typeable a => Proxy a
40 lp = fromJust $ lookup tmap
42-- TypeRepMap of 10000 elements
43bigMap :: TypeRepMap (Proxy :: Nat -> *)
44bigMap = fromList $ buildBigMap 10000 (Proxy :: Proxy 0) []
46buildBigMap :: forall a . (KnownNat a)
47 => Int
48 -> Proxy (a :: Nat)
49 -> [TF (Proxy :: Nat -> *)]
50 -> [TF (Proxy :: Nat -> *)]
51buildBigMap 1 x = (TF x :)
52buildBigMap n x = (TF x :) . buildBigMap (n - 1) (Proxy :: Proxy (a + 1))