diff options
author | Joey Hess <joeyh@joeyh.name> | 2019-01-04 13:43:53 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2019-01-04 13:46:36 -0400 |
commit | 11d6e2e260d70ba99e35464c19c2b2772ce9efaa (patch) | |
tree | 6b868cdbd233b10feaf6012f94113f3650573679 /Benchmark.hs | |
parent | 3b3d31583b186b4c38458f316043c3e22534081e (diff) |
new improved benchmark command that can benchmark anything git-annex does
Diffstat (limited to 'Benchmark.hs')
-rw-r--r-- | Benchmark.hs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/Benchmark.hs b/Benchmark.hs new file mode 100644 index 0000000000..35ae9ef11b --- /dev/null +++ b/Benchmark.hs @@ -0,0 +1,53 @@ +{- git-annex benchmark infrastructure + - + - Copyright 2019 Joey Hess <id@joeyh.name> + - + - Licensed under the GNU AGPL version 3 or higher. + -} + +module Benchmark where + +import Common +import Types.Benchmark +import Types.Command +import CmdLine.Action +import CmdLine +import CmdLine.GitAnnex.Options +import qualified Annex +import qualified Annex.Branch +import Annex.Action + +import qualified Options.Applicative as O + +{- Given a list of all git-annex Commands, and the user's input, + - generates an IO action to benchmark that runs the specified + - commands. -} +mkGenerator :: MkBenchmarkGenerator +mkGenerator cmds userinput = do + -- Get the git-annex branch updated, to avoid the overhead of doing + -- so skewing the runtime of the first action that will be + -- benchmarked. + Annex.Branch.commit "benchmarking" + Annex.Branch.update + l <- mapM parsesubcommand $ split [";"] userinput + return $ do + forM_ l $ \(cmd, seek, st) -> + -- The cmd is run for benchmarking without startup or + -- shutdown actions. + Annex.eval st $ performCommandAction cmd seek noop + -- Since the cmd will be run many times, some zombie + -- processes that normally only occur once per command + -- will build up; reap them. + reapZombies + where + -- Simplified versio of CmdLine.dispatch, without support for fuzzy + -- matching or out-of-repo commands. + parsesubcommand ps = do + (cmd, seek, globalconfig) <- liftIO $ O.handleParseResult $ + parseCmd "git-annex" "benchmarking" gitAnnexGlobalOptions ps cmds cmdparser + -- Make an entirely separate Annex state for each subcommand, + -- and prepare it to run the cmd. + st <- liftIO . Annex.new =<< Annex.getState Annex.repo + ((), st') <- liftIO $ Annex.run st $ + prepRunCommand cmd globalconfig + return (cmd, seek, st') |