11{-# LANGUAGE BangPatterns #-}
22{-# LANGUAGE ScopedTypeVariables #-}
33
4- module SetOperations (benchmark ) where
4+ module SetOperations (benchmark , benchmark' ) where
55
66import Test.Tasty.Bench (bench , defaultMain , whnf )
77import 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.
1616benchmark :: 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