1{-# LANGUAGE RecordWildCards #-}
2{-# LANGUAGE ScopedTypeVariables #-}
6import Control.Exception (catch, ErrorCall(..))
7import Control.Monad.Trans.State
8import Control.Monad.Trans.Maybe
9import Data.Char (toLower)
11import System.Environment (getArgs)
12import Control.Monad.IO.Class (liftIO)
13import Control.Monad (mzero)
17------------------------------------------------------------------------------
18-- Command line parsing
19------------------------------------------------------------------------------
28 , benchType :: Maybe BenchType
32defaultOptions :: Options
33defaultOptions = Options False Nothing ["time"]
35setGenGraphs :: Monad m => Bool -> StateT (a, Options) m ()
38 put (args, opts { genGraphs = val })
40setBenchType :: Monad m => BenchType -> StateT (a, Options) m ()
43 put (args, opts { benchType = Just val })
45setFields :: Monad m => [String] -> StateT (a, Options) m ()
48 put (args, opts { fields = val })
50-- Like the shell "shift" to shift the command line arguments
51shift :: StateT ([String], Options) (MaybeT IO) (Maybe String)
55 ([], _) -> return Nothing
56 (x : xs, opts) -> put (xs, opts) >> return (Just x)
58parseBench :: StateT ([String], Options) (MaybeT IO) ()
62 Just str | "_cmp" `isSuffixOf` str -> setBenchType (Compare str)
63 Just str -> setBenchType (Standard str)
65 liftIO $ putStrLn "please provide a benchmark type "
68parseFields :: StateT ([String], Options) (MaybeT IO) ()
72 Just str -> setFields (words str)
75 "please provide a list of fields after --fields"
78-- totally imperative style option parsing
79parseOptions :: IO (Maybe Options)
82 runMaybeT $ flip evalStateT (args, defaultOptions) $ do
90 "--graphs" -> setGenGraphs True
91 "--benchmark" -> parseBench
92 "--fields" -> parseFields
94 liftIO $ putStrLn $ "Unrecognized option " <> str
100 Just opt -> parseOpt opt >> parseLoop
103ignoringErr :: IO () -> IO ()
104ignoringErr a = catch a (\(ErrorCall err :: ErrorCall) ->
105 putStrLn $ "Failed with error:\n" <> err <> "\nSkipping.")
107------------------------------------------------------------------------------
109------------------------------------------------------------------------------
111makeGraphs :: String -> Config -> String -> IO ()
112makeGraphs name cfg@Config{..} inputFile =
113 ignoringErr $ graph inputFile name cfg
115------------------------------------------------------------------------------
117------------------------------------------------------------------------------
119showComparisons :: Options -> Config -> FilePath -> FilePath -> IO ()
120showComparisons Options{..} cfg inp out =
121 let cfg1 = cfg { classifyBenchmark = classifyComparison }
123 then ignoringErr $ graph inp "comparison"
124 cfg1 { outputDir = Just out
125 , presentation = Groups Absolute
127 else ignoringErr $ report inp Nothing cfg1
131 dropComponent = dropWhile (== '/') . dropWhile (/= '/')
133 classifyComparison b = Just
134 ( takeWhile (/= '/') b
138------------------------------------------------------------------------------
140------------------------------------------------------------------------------
143 :: (SortColumn -> Maybe GroupStyle -> Either String [(String, Double)])
149 (const $ either error (sortOn snd) $ f (ColumnIndex 0) (Just PercentDiff))
151 $ f (ColumnIndex 1) (Just PercentDiff)
156 -> (Config -> String -> IO ())
160benchShow Options{..} cfg func inp out =
162 then func cfg {outputDir = Just out} inp
163 else ignoringErr $ report inp Nothing cfg
170 putStrLn "cannot parse options"
172 Just opts@Options{fields = fs, benchType = btype} ->
173 let cfg = defaultConfig
174 { presentation = Groups PercentDiff
175 , selectBenchmarks = selectBench
176 , selectFields = filter
182 Just (Compare str) ->
183 showComparisons opts cfg
185 ("charts/" ++ str ++ "/results.csv")
187 Just (Standard str) ->
191 ("charts/" ++ str ++ "/results.csv")
194 error "Please specify a benchmark using --benchmark."
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list