@@ -4,13 +4,15 @@
4module Main where
4module Main where
6import Control.Exception (catch, ErrorCall(..))
6import Control.Exception (catch, ErrorCall(..))
7−import Control.Monad.Trans.State
7+import Control.Monad (mzero)
8+import Control.Monad.IO.Class (liftIO)
8import Control.Monad.Trans.Maybe
9import Control.Monad.Trans.Maybe
10+import Control.Monad.Trans.State
9import Data.Char (toLower)
11import Data.Char (toLower)
10import Data.List
12import Data.List
13+import GHC.Real (infinity)
11import System.Environment (getArgs)
14import System.Environment (getArgs)
12−import Control.Monad.IO.Class (liftIO)
15+import Text.Read (readMaybe)
13−import Control.Monad (mzero)
15import BenchShow
17import BenchShow
@@ -28,10 +30,12 @@ data Options = Options
28 , sortByName :: Bool
30 , sortByName :: Bool
29 , benchType :: Maybe BenchType
31 , benchType :: Maybe BenchType
30 , fields :: [String]
32 , fields :: [String]
33+ , diffStyle :: GroupStyle
34+ , cutOffPercent :: Double
31 } deriving Show
35 } deriving Show
33defaultOptions :: Options
37defaultOptions :: Options
34−defaultOptions = Options False False Nothing ["time"]
38+defaultOptions = Options False False Nothing ["time"] PercentDiff 0
36setGenGraphs :: Monad m => Bool -> StateT (a, Options) m ()
40setGenGraphs :: Monad m => Bool -> StateT (a, Options) m ()
37setGenGraphs val = do
41setGenGraphs val = do
@@ -53,6 +57,24 @@ setFields val = do
53 (args, opts) <- get
57 (args, opts) <- get
54 put (args, opts { fields = val })
58 put (args, opts { fields = val })
60+setDiff :: Monad m => String -> StateT (a, Options) m ()
65+ "absolute" -> Absolute
66+ "multiples" -> Multiples
67+ "percent" -> PercentDiff
68+ x -> error $ "Unknown diff option: " ++ show x
69+ in put (args, opts { diffStyle = cmpStyle })
71+setCutOff :: Monad m => String -> StateT (a, Options) m ()
74+ case readMaybe val of
75+ Just x -> put (args, opts { cutOffPercent = x })
76+ Nothing -> error $ "Invalid cutoff value: " ++ show val
56-- Like the shell "shift" to shift the command line arguments
78-- Like the shell "shift" to shift the command line arguments
57shift :: StateT ([String], Options) (MaybeT IO) (Maybe String)
79shift :: StateT ([String], Options) (MaybeT IO) (Maybe String)
@@ -81,6 +103,24 @@ parseFields = do
81 "please provide a list of fields after --fields"
103 "please provide a list of fields after --fields"
106+parseDiff :: StateT ([String], Options) (MaybeT IO) ()
110+ Just str -> setDiff str
112+ liftIO $ putStrLn "please provide a diff type"
115+parseCutOff :: StateT ([String], Options) (MaybeT IO) ()
119+ Just str -> setCutOff str
121+ liftIO $ putStrLn "please provide a cutoff percent"
84-- totally imperative style option parsing
124-- totally imperative style option parsing
85parseOptions :: IO (Maybe Options)
125parseOptions :: IO (Maybe Options)
86parseOptions = do
126parseOptions = do
@@ -93,10 +133,12 @@ parseOptions = do
94 parseOpt opt =
134 parseOpt opt =
95 case opt of
135 case opt of
96− "--graphs" -> setGenGraphs True
136+ "--graphs" -> setGenGraphs True
97 "--sort-by-name" -> setSortByName True
137 "--sort-by-name" -> setSortByName True
98 "--benchmark" -> parseBench
138 "--benchmark" -> parseBench
99− "--fields" -> parseFields
139+ "--fields" -> parseFields
140+ "--diff-style" -> parseDiff
141+ "--diff-cutoff-percent" -> parseCutOff
100 str -> do
142 str -> do
101 liftIO $ putStrLn $ "Unrecognized option " <> str
143 liftIO $ putStrLn $ "Unrecognized option " <> str
@@ -147,12 +189,13 @@ showComparisons Options{..} cfg inp out =
147------------------------------------------------------------------------------
189------------------------------------------------------------------------------
149selectBench
191selectBench
150− :: Bool
192+ :: Options
151 -> (SortColumn -> Maybe GroupStyle -> Either String [(String, Double)])
193 -> (SortColumn -> Maybe GroupStyle -> Either String [(String, Double)])
152 -> [String]
194 -> [String]
153−selectBench sortName f =
195+selectBench Options{..} f =
155 $ fmap fst
197 $ fmap fst
198+ $ filter (\(_,y) -> filterPred y)
157 (const $ either error sortFunc $ f (ColumnIndex 0) (Just PercentDiff))
200 (const $ either error sortFunc $ f (ColumnIndex 0) (Just PercentDiff))
@@ -160,7 +203,15 @@ selectBench sortName f =
163− sortFunc = if sortName then sortOn fst else sortOn snd
206+ sortFunc = if sortByName then sortOn fst else sortOn snd
208+ cutOffMultiples = 1 + cutOffPercent / 100
213+ x <= (negate cutOffPercent) || x >= cutOffPercent
165benchShow ::
216benchShow ::
@@ -183,8 +234,8 @@ main = do
183 return ()
234 return ()
184 Just opts@Options{fields = fs, benchType = btype} ->
235 Just opts@Options{fields = fs, benchType = btype} ->
185 let cfg = defaultConfig
236 let cfg = defaultConfig
186− { presentation = Groups PercentDiff
237+ { presentation = Groups (diffStyle opts)
187− , selectBenchmarks = selectBench (sortByName opts)
238+ , selectBenchmarks = selectBench opts
188 , selectFields = filter
239 , selectFields = filter
189 ( flip elem (fmap (fmap toLower) fs)
240 ( flip elem (fmap (fmap toLower) fs)
190 . fmap toLower
241 . fmap toLower