@@ -11,10 +11,23 @@ import Data.Maybe (fromMaybe)
11
11
import Prelude hiding (lookup )
12
12
13
13
main = 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'''']
16
20
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''''
18
31
, bench " insert" $ whnf (ins elems) M. empty
19
32
, bench " insertWith empty" $ whnf (insWith elems) M. empty
20
33
, bench " insertWith update" $ whnf (insWith elems) m
@@ -44,19 +57,33 @@ main = do
44
57
(M. fromList $ zip [1 .. 10 ] [1 .. 10 ])
45
58
]
46
59
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
+ --------------------------------------------------------
48
67
keys = [1 .. 2 ^ 12 ]
68
+ keys' = fmap (+ 1000000 ) keys
69
+ keys'' = fmap (* 2 ) [1 .. 2 ^ 12 ]
70
+ mixedKeys = interleave keys keys'
49
71
values = [1 .. 2 ^ 12 ]
72
+ --------------------------------------------------------
50
73
sum k v1 v2 = k + v1 + v2
51
74
consPair k v xs = (k, v) : xs
52
75
76
+ ------------------------------------------------------------
53
77
add3 :: Int -> Int -> Int -> Int
54
78
add3 x y z = x + y + z
55
79
{-# INLINE add3 #-}
56
80
57
81
lookup :: [Int ] -> M. IntMap Int -> Int
58
82
lookup xs m = foldl' (\ n k -> fromMaybe n (M. lookup k m)) 0 xs
59
83
84
+ query :: [Int ] -> M. IntMap Int -> Int
85
+ query xs m = foldl' (\ n k -> fromMaybe n (M. query k m)) 0 xs
86
+
60
87
ins :: [(Int , Int )] -> M. IntMap Int -> M. IntMap Int
61
88
ins xs m = foldl' (\ m (k, v) -> M. insert k v m) m xs
62
89
@@ -95,3 +122,8 @@ alt xs m = foldl' (\m k -> M.alter id k m) m xs
95
122
maybeDel :: Int -> Maybe Int
96
123
maybeDel n | n `mod` 3 == 0 = Nothing
97
124
| 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