@@ -11,10 +11,23 @@ import Data.Maybe (fromMaybe)
1111import Prelude hiding (lookup )
1212
1313main = do
14- let m = M. fromAscList elems :: M. IntMap Int
15- evaluate $ rnf [m]
14+ let m = M. fromAscList elems_hits :: M. IntMap Int
15+ let m' = M. fromAscList elems_mid :: M. IntMap Int
16+ let m'' = M. fromAscList elems_most :: M. IntMap Int
17+ let m''' = M. fromAscList elems_misses :: M. IntMap Int
18+ let m'''' = M. fromAscList elems_mixed :: M. IntMap Int
19+ evaluate $ rnf [m, m', m'', m''', m'''']
1620 defaultMain
17- [ bench " lookup" $ whnf (lookup keys) m
21+ [ bench " query_hits" $ whnf (query keys) m
22+ , bench " query_half" $ whnf (query keys) m'
23+ , bench " query_most" $ whnf (query keys) m''
24+ , bench " query_misses" $ whnf (query keys'') m'''
25+ , bench " query_mixed" $ whnf (query keys) m''''
26+ , bench " lookup_hits" $ whnf (lookup keys) m
27+ , bench " lookup_half" $ whnf (lookup keys) m'
28+ , bench " lookup_most" $ whnf (lookup keys) m''
29+ , bench " lookup_misses" $ whnf (lookup keys'') m'''
30+ , bench " lookup_mixed" $ whnf (lookup keys) m''''
1831 , bench " insert" $ whnf (ins elems) M. empty
1932 , bench " insertWith empty" $ whnf (insWith elems) M. empty
2033 , bench " insertWith update" $ whnf (insWith elems) m
@@ -44,19 +57,33 @@ main = do
4457 (M. fromList $ zip [1 .. 10 ] [1 .. 10 ])
4558 ]
4659 where
47- elems = zip keys values
60+ elems = elems_hits
61+ elems_hits = zip keys values
62+ elems_mid = zip (map (+ (2 ^ 12 `div` 2 )) keys) values
63+ elems_most = zip (map (+ (2 ^ 12 `div` 10 )) keys) values
64+ elems_misses = zip (map (\ x-> x * 2 + 1 ) keys) values
65+ elems_mixed = zip mixedKeys values
66+ --------------------------------------------------------
4867 keys = [1 .. 2 ^ 12 ]
68+ keys' = fmap (+ 1000000 ) keys
69+ keys'' = fmap (* 2 ) [1 .. 2 ^ 12 ]
70+ mixedKeys = interleave keys keys'
4971 values = [1 .. 2 ^ 12 ]
72+ --------------------------------------------------------
5073 sum k v1 v2 = k + v1 + v2
5174 consPair k v xs = (k, v) : xs
5275
76+ ------------------------------------------------------------
5377add3 :: Int -> Int -> Int -> Int
5478add3 x y z = x + y + z
5579{-# INLINE add3 #-}
5680
5781lookup :: [Int ] -> M. IntMap Int -> Int
5882lookup xs m = foldl' (\ n k -> fromMaybe n (M. lookup k m)) 0 xs
5983
84+ query :: [Int ] -> M. IntMap Int -> Int
85+ query xs m = foldl' (\ n k -> fromMaybe n (M. query k m)) 0 xs
86+
6087ins :: [(Int , Int )] -> M. IntMap Int -> M. IntMap Int
6188ins xs m = foldl' (\ m (k, v) -> M. insert k v m) m xs
6289
@@ -95,3 +122,8 @@ alt xs m = foldl' (\m k -> M.alter id k m) m xs
95122maybeDel :: Int -> Maybe Int
96123maybeDel n | n `mod` 3 == 0 = Nothing
97124 | otherwise = Just n
125+
126+ ------------------------------------------------------------
127+ interleave :: [Int ] -> [Int ] -> [Int ]
128+ interleave [] ys = ys
129+ interleave (x: xs) (y: ys) = x : y : interleave xs ys
0 commit comments