Skip to content

Commit a4ddb15

Browse files
committed
Generalise SetOperations benchmark creation to accomodate Data.Map.partitionKeys which has different types for first, second argument and for result
1 parent d117f3e commit a4ddb15

File tree

1 file changed

+44
-22
lines changed

1 file changed

+44
-22
lines changed
Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{-# LANGUAGE BangPatterns #-}
22
{-# LANGUAGE ScopedTypeVariables #-}
33

4-
module SetOperations (benchmark) where
4+
module SetOperations (benchmark, benchmark') where
55

66
import Test.Tasty.Bench (bench, defaultMain, whnf)
77
import Data.List (partition, sortBy)
@@ -14,13 +14,24 @@ import Data.Tuple as Tuple
1414
-- * Flag if we should benchmark the operations with reversed arguments.
1515
-- * A list of operations.
1616
benchmark :: forall container. (Show container, Eq container) => ([Int] -> container) -> Bool -> [(String, container -> container -> container)] -> IO ()
17-
benchmark fromList swap methods = do
17+
benchmark fromList swap methods =
18+
benchmark' fromList fromList swap methods
19+
20+
benchmark'
21+
:: forall container1 container2 container3.
22+
(Show container1, Eq container1, Show container2, Eq container2, Show container3, Eq container3)
23+
=> ([Int] -> container1)
24+
-> ([Int] -> container2)
25+
-> Bool
26+
-> [(String, container1 -> container2 -> container3)]
27+
-> IO ()
28+
benchmark' fromList1 fromList2 swap methods = do
1829

1930
defaultMain $ [ bench (method_str++"-"++input_str ++ "_" ++ data_sizes) $
2031
whnf (method input1) input2
2132

2233
| (method_str, method) <- methods
23-
, (input_str, data_sizes, (input1, input2)) <- sortBenchs (base_inputs ++ swapped_input)
34+
, (input_str, data_sizes, (input1, input2)) <- sortBenchs all_inputs
2435
]
2536

2637
where
@@ -36,12 +47,23 @@ benchmark fromList swap methods = do
3647
s {-small-} = n `div` 10
3748
t {-tiny-} = round $ sqrt $ fromIntegral n
3849

39-
base_inputs :: [(String,String,(container,container))]
40-
base_inputs = [ ("disj", "nn", disj_nn), ("disj","ns", disj_ns), ("disj","nt", disj_nt)
41-
, ("common","nn", common_nn), ("common","ns", common_ns), ("common","nt", common_nt)
42-
, ("mix","nn", mix_nn), ("mix","ns", mix_ns), ("mix","nt", mix_nt)
43-
, ("block","nn", block_nn), ("block","ns", block_ns)
44-
]
50+
all_inputs :: [(String, String, (container1, container2))]
51+
all_inputs = map (\(a, b, c) -> (a, b, fromLists c)) $ base_inputs ++ swapped_input
52+
53+
base_inputs :: [(String, String, ([Int], [Int]))]
54+
base_inputs =
55+
[ ("disj", "nn", disj_nn)
56+
, ("disj", "ns", disj_ns)
57+
, ("disj", "nt", disj_nt)
58+
, ("common", "nn", common_nn)
59+
, ("common", "ns", common_ns)
60+
, ("common", "nt", common_nt)
61+
, ("mix", "nn", mix_nn)
62+
, ("mix", "ns", mix_ns)
63+
, ("mix", "nt", mix_nt)
64+
, ("block", "nn", block_nn)
65+
, ("block", "ns", block_ns)
66+
]
4567

4668
-- Input with set arguments swapped.
4769
swapped_input
@@ -53,19 +75,19 @@ benchmark fromList swap methods = do
5375
(name, reverse data_sizes ++ "_swap", Tuple.swap input_data)
5476

5577
-- Data variants
56-
all_n = fromList [1..n]
78+
all_n = [1..n]
5779

58-
!disj_nn = seqPair $ (all_n, fromList [n+1..n+n])
59-
!disj_ns = seqPair $ (all_n, fromList [n+1..n+s])
60-
!disj_nt = seqPair $ (all_n, fromList [n+1..n+t])
61-
!common_nn = seqPair $ (all_n, fromList [2,4..n])
62-
!common_ns = seqPair $ (all_n, fromList [0,1+n`div`s..n])
63-
!common_nt = seqPair $ (all_n, fromList [0,1+n`div`t..n])
64-
!mix_nn = seqPair $ fromLists $ partition ((/= 0) . (`mod` 2)) [1..n+n]
65-
!mix_ns = seqPair $ fromLists $ partition ((/= 0) . (`mod` (1 + n`div`s))) [1..s+n]
66-
!mix_nt = seqPair $ fromLists $ partition ((/= 0) . (`mod` (1 + n`div`t))) [1..t+n]
67-
!block_nn = seqPair $ fromLists $ partition ((>= t) . (`mod` (t * 2))) [1..n+n]
68-
!block_ns = seqPair $ fromLists $ partition ((>= t) . (`mod` (t * (1 + n`div`s)))) [1..s+n]
80+
!disj_nn = (all_n, [n+1..n+n])
81+
!disj_ns = (all_n, [n+1..n+s])
82+
!disj_nt = (all_n, [n+1..n+t])
83+
!common_nn = (all_n, [2,4..n])
84+
!common_ns = (all_n, [0,1+n`div`s..n])
85+
!common_nt = (all_n, [0,1+n`div`t..n])
86+
!mix_nn = partition ((/= 0) . (`mod` 2)) [1..n+n]
87+
!mix_ns = partition ((/= 0) . (`mod` (1 + n`div`s))) [1..s+n]
88+
!mix_nt = partition ((/= 0) . (`mod` (1 + n`div`t))) [1..t+n]
89+
!block_nn = partition ((>= t) . (`mod` (t * 2))) [1..n+n]
90+
!block_ns = partition ((>= t) . (`mod` (t * (1 + n`div`s)))) [1..s+n]
6991

70-
fromLists (xs, ys) = (fromList xs, fromList ys)
92+
fromLists (xs, ys) = seqPair (fromList1 xs, fromList2 ys)
7193
seqPair pair@(xs, ys) = xs `seq` ys `seq` pair

0 commit comments

Comments
 (0)