1
1
{-# LANGUAGE BangPatterns #-}
2
2
{-# LANGUAGE ScopedTypeVariables #-}
3
3
4
- module SetOperations (benchmark ) where
4
+ module SetOperations (benchmark , benchmark' ) where
5
5
6
6
import Test.Tasty.Bench (bench , defaultMain , whnf )
7
7
import Data.List (partition , sortBy )
@@ -14,13 +14,24 @@ import Data.Tuple as Tuple
14
14
-- * Flag if we should benchmark the operations with reversed arguments.
15
15
-- * A list of operations.
16
16
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
18
29
19
30
defaultMain $ [ bench (method_str++ " -" ++ input_str ++ " _" ++ data_sizes) $
20
31
whnf (method input1) input2
21
32
22
33
| (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
24
35
]
25
36
26
37
where
@@ -36,12 +47,23 @@ benchmark fromList swap methods = do
36
47
s {- small-} = n `div` 10
37
48
t {- tiny-} = round $ sqrt $ fromIntegral n
38
49
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
+ ]
45
67
46
68
-- Input with set arguments swapped.
47
69
swapped_input
@@ -53,19 +75,19 @@ benchmark fromList swap methods = do
53
75
(name, reverse data_sizes ++ " _swap" , Tuple. swap input_data)
54
76
55
77
-- Data variants
56
- all_n = fromList [1 .. n]
78
+ all_n = [1 .. n]
57
79
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]
69
91
70
- fromLists (xs, ys) = (fromList xs, fromList ys)
92
+ fromLists (xs, ys) = seqPair (fromList1 xs, fromList2 ys)
71
93
seqPair pair@ (xs, ys) = xs `seq` ys `seq` pair
0 commit comments