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------------------------------------------------------------------------------
29 , benchType :: Maybe BenchType
33defaultOptions :: Options
34defaultOptions = Options False False Nothing ["time"]
36setGenGraphs :: Monad m => Bool -> StateT (a, Options) m ()
39 put (args, opts { genGraphs = val })
41setSortByName :: Monad m => Bool -> StateT (a, Options) m ()
44 put (args, opts { sortByName = val })
46setBenchType :: Monad m => BenchType -> StateT (a, Options) m ()
49 put (args, opts { benchType = Just val })
51setFields :: Monad m => [String] -> StateT (a, Options) m ()
54 put (args, opts { fields = val })
56-- Like the shell "shift" to shift the command line arguments
57shift :: StateT ([String], Options) (MaybeT IO) (Maybe String)
61 ([], _) -> return Nothing
62 (x : xs, opts) -> put (xs, opts) >> return (Just x)
64parseBench :: StateT ([String], Options) (MaybeT IO) ()
68 Just str | "_cmp" `isSuffixOf` str -> setBenchType (Compare str)
69 Just str -> setBenchType (Standard str)
71 liftIO $ putStrLn "please provide a benchmark type "
74parseFields :: StateT ([String], Options) (MaybeT IO) ()
78 Just str -> setFields (words str)
81 "please provide a list of fields after --fields"
84-- totally imperative style option parsing
85parseOptions :: IO (Maybe Options)
88 runMaybeT $ flip evalStateT (args, defaultOptions) $ do
96 "--graphs" -> setGenGraphs True
97 "--sort-by-name" -> setSortByName True
98 "--benchmark" -> parseBench
99 "--fields" -> parseFields
101 liftIO $ putStrLn $ "Unrecognized option " <> str
107 Just opt -> parseOpt opt >> parseLoop
110ignoringErr :: IO () -> IO ()
111ignoringErr a = catch a (\(ErrorCall err :: ErrorCall) ->
112 putStrLn $ "Failed with error:\n" <> err <> "\nSkipping.")
114------------------------------------------------------------------------------
116------------------------------------------------------------------------------
118makeGraphs :: String -> Config -> String -> IO ()
119makeGraphs name cfg@Config{..} inputFile =
120 ignoringErr $ graph inputFile name cfg
122------------------------------------------------------------------------------
124------------------------------------------------------------------------------
126showComparisons :: Options -> Config -> FilePath -> FilePath -> IO ()
127showComparisons Options{..} cfg inp out =
128 let cfg1 = cfg { classifyBenchmark = classifyComparison }
130 then ignoringErr $ graph inp "comparison"
131 cfg1 { outputDir = Just out
132 , presentation = Groups Absolute
134 else ignoringErr $ report inp Nothing cfg1
138 dropComponent = dropWhile (== '/') . dropWhile (/= '/')
140 classifyComparison b = Just
141 ( takeWhile (/= '/') b
145------------------------------------------------------------------------------
147------------------------------------------------------------------------------
151 -> (SortColumn -> Maybe GroupStyle -> Either String [(String, Double)])
153selectBench sortName f =
157 (const $ either error sortFunc $ f (ColumnIndex 0) (Just PercentDiff))
159 $ f (ColumnIndex 1) (Just PercentDiff)
163 sortFunc = if sortName then sortOn fst else sortOn snd
168 -> (Config -> String -> IO ())
172benchShow Options{..} cfg func inp out =
174 then func cfg {outputDir = Just out} inp
175 else ignoringErr $ report inp Nothing cfg
182 putStrLn "cannot parse options"
184 Just opts@Options{fields = fs, benchType = btype} ->
185 let cfg = defaultConfig
186 { presentation = Groups PercentDiff
187 , selectBenchmarks = selectBench (sortByName opts)
188 , selectFields = filter
194 Just (Compare str) ->
195 showComparisons opts cfg
197 ("charts/" ++ str ++ "/results.csv")
199 Just (Standard str) ->
203 ("charts/" ++ str ++ "/results.csv")
206 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