"make bench" runs some benchmark tests and saves results
This commit is contained in:
parent
9b98a1722f
commit
b61c4f85e6
4
Makefile
4
Makefile
@ -29,6 +29,10 @@ test:
|
|||||||
@./hledger.hs test
|
@./hledger.hs test
|
||||||
@./regtest.py
|
@./regtest.py
|
||||||
|
|
||||||
|
# run performance benchmarks and save results in profs
|
||||||
|
bench:
|
||||||
|
tools/bench.hs bench.tests 2 hledger ledger "ledger --no-cache" | tee profs/`date +%Y%m%d%H%M%S`.bench
|
||||||
|
|
||||||
VERSION=`grep 'versionno =' Options.hs | perl -pe 's/.*"(.*?)"/\1/'`
|
VERSION=`grep 'versionno =' Options.hs | perl -pe 's/.*"(.*?)"/\1/'`
|
||||||
release:
|
release:
|
||||||
cabal sdist && darcs tag $(VERSION) && cabal upload dist/hledger-$(VERSION).tar.gz
|
cabal sdist && darcs tag $(VERSION) && cabal upload dist/hledger-$(VERSION).tar.gz
|
||||||
|
|||||||
1
NOTES
1
NOTES
@ -18,7 +18,6 @@ clever tricks like the plague." --Edsger Dijkstra
|
|||||||
*** ~/.hledgerrc, for setting defaults
|
*** ~/.hledgerrc, for setting defaults
|
||||||
*** more ledger features from README (?)
|
*** more ledger features from README (?)
|
||||||
*** speed
|
*** speed
|
||||||
**** easy benchmarking
|
|
||||||
**** speed regression tests
|
**** speed regression tests
|
||||||
**** easy profiling
|
**** easy profiling
|
||||||
**** cache file ?
|
**** cache file ?
|
||||||
|
|||||||
6
bench.tests
Normal file
6
bench.tests
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
# see tools/bench.hs
|
||||||
|
|
||||||
|
-f sample.ledger register
|
||||||
|
-f sample.ledger -s balance
|
||||||
|
-f ~/.ledger register
|
||||||
|
-f ~/.ledger -s balance
|
||||||
125
tools/bench.hs
Normal file
125
tools/bench.hs
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
#!/usr/bin/env runhaskell
|
||||||
|
{-
|
||||||
|
bench.hs (see usage string below).
|
||||||
|
|
||||||
|
For simple benchmarking. Similar to my darcs-benchmark/bench.hs script.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
$ cat - >bench.tests
|
||||||
|
-f sample.ledger -s balance
|
||||||
|
-f ~/.ledger -s balance
|
||||||
|
$ bench.hs bench.tests 2 hledger "ledger --no-cache" ledger
|
||||||
|
Running 2 tests 2 times in . with 3 executables at 2008-11-26 18:52:15.776357 UTC:
|
||||||
|
1: hledger -f sample.ledger -s balance [0.02s]
|
||||||
|
2: hledger -f sample.ledger -s balance [0.01s]
|
||||||
|
1: ledger --no-cache -f sample.ledger -s balance [0.02s]
|
||||||
|
2: ledger --no-cache -f sample.ledger -s balance [0.02s]
|
||||||
|
1: ledger -f sample.ledger -s balance [0.02s]
|
||||||
|
2: ledger -f sample.ledger -s balance [0.02s]
|
||||||
|
1: hledger -f ~/.ledger -s balance [3.56s]
|
||||||
|
2: hledger -f ~/.ledger -s balance [3.56s]
|
||||||
|
1: ledger --no-cache -f ~/.ledger -s balance [0.10s]
|
||||||
|
2: ledger --no-cache -f ~/.ledger -s balance [0.10s]
|
||||||
|
1: ledger -f ~/.ledger -s balance [0.10s]
|
||||||
|
2: ledger -f ~/.ledger -s balance [0.10s]
|
||||||
|
|
||||||
|
Summary (best iteration):
|
||||||
|
|
||||||
|
|| hledger | ledger --no-cache | ledger
|
||||||
|
============================++=========+===================+=======
|
||||||
|
-f sample.ledger -s balance || 0.01 | 0.02 | 0.02
|
||||||
|
-f ~/.ledger -s balance || 3.56 | 0.10 | 0.10
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
import Data.Char
|
||||||
|
import Data.List
|
||||||
|
import Data.Maybe
|
||||||
|
import Numeric
|
||||||
|
import System.Environment
|
||||||
|
import System.Directory
|
||||||
|
import System.FilePath
|
||||||
|
import System.Cmd
|
||||||
|
import System.IO
|
||||||
|
import Text.Tabular
|
||||||
|
import qualified Text.Tabular.AsciiArt as TA
|
||||||
|
import qualified Text.Tabular.Html as TH
|
||||||
|
import Text.Html ((+++), renderHtml)
|
||||||
|
import System.Exit
|
||||||
|
import Text.Printf
|
||||||
|
import Data.Time.Clock
|
||||||
|
import Data.Time.Format
|
||||||
|
import System.Locale
|
||||||
|
import Control.Monad
|
||||||
|
import Debug.Trace
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
usage = "bench.hs <testsfile> <num> [<executable> ...]\n" ++
|
||||||
|
"\n" ++
|
||||||
|
"Run some functional tests, defined as lines of arguments in\n" ++
|
||||||
|
"testsfile, num times with each of the specified executables,\n" ++
|
||||||
|
"printing the execution times and a summary.\n" ++
|
||||||
|
"Tips:\n" ++
|
||||||
|
"- comment out tests with #\n"
|
||||||
|
|
||||||
|
precision = 2
|
||||||
|
|
||||||
|
main = do
|
||||||
|
(testsfile,iterations,dir,exes) <- getArgs >>= return . parseargs
|
||||||
|
tests <- readFile testsfile >>= return . testlines
|
||||||
|
now <- getCurrentTime
|
||||||
|
putStrLn $ printf "Running %d tests %d times in %s with %d executables at %s:\n"
|
||||||
|
(length tests) (iterations) dir (length exes) (show now)
|
||||||
|
let doexe t e = sequence $ map (doiteration t e dir) [1..iterations]
|
||||||
|
let dotest t = sequence $ map (doexe t) exes
|
||||||
|
hSetBuffering stdout NoBuffering
|
||||||
|
results <- mapM dotest tests
|
||||||
|
summarise tests exes results
|
||||||
|
where
|
||||||
|
-- parseargs (t:n:d:[]) = parseargs (t:n:d:["darcs"])
|
||||||
|
parseargs (t:n:es) = (t,read n,".",es)
|
||||||
|
parseargs _ = error $ "\n" ++ usage
|
||||||
|
testlines s = filter istest $ map clean $ lines s
|
||||||
|
istest s = not (null s || ("#" `isPrefixOf` s))
|
||||||
|
clean = unwords . words
|
||||||
|
|
||||||
|
doiteration :: String -> String -> String -> Int -> IO Float
|
||||||
|
doiteration test exe dir iteration = do
|
||||||
|
let cmd = unwords [exe,test]
|
||||||
|
putStr $ show iteration ++ ": " ++ cmd
|
||||||
|
hFlush stdout
|
||||||
|
t <- time cmd
|
||||||
|
printf "\t[%ss]\n" (showtime t)
|
||||||
|
return t
|
||||||
|
|
||||||
|
time :: String -> IO Float
|
||||||
|
time cmd = do
|
||||||
|
t1 <- getCurrentTime
|
||||||
|
ret <- system $ cmd ++ ">/dev/null 2>&1"
|
||||||
|
case ret of
|
||||||
|
ExitSuccess -> return ()
|
||||||
|
ExitFailure f -> putStr $ printf " (error %d)" f
|
||||||
|
t2 <- getCurrentTime
|
||||||
|
return $ realToFrac $ diffUTCTime t2 t1
|
||||||
|
|
||||||
|
summarise tests exes results = do
|
||||||
|
-- putStrLn ""; print results
|
||||||
|
putStrLn "\nSummary (best iteration):\n"
|
||||||
|
let t = maketable tests exes results
|
||||||
|
putStrLn $ TA.render id t
|
||||||
|
-- putStrLn $ "See " ++ prefix ++ "summary.*"
|
||||||
|
let outname = "summary"
|
||||||
|
writeFile (outname <.> "txt") $ TA.render id t
|
||||||
|
writeFile (outname <.> "html") $ renderHtml $ TH.css TH.defaultCss +++ TH.render id t
|
||||||
|
|
||||||
|
maketable :: [String] -> [String] -> [[[Float]]] -> Table String
|
||||||
|
maketable rownames colnames results = Table rowhdrs colhdrs rows
|
||||||
|
where
|
||||||
|
rowhdrs = Group NoLine $ map Header rownames
|
||||||
|
colhdrs = Group SingleLine $ map Header colnames
|
||||||
|
rows = map (map (showtime . minimum)) results
|
||||||
|
|
||||||
|
showtime = printf $ "%."++(show precision)++"f"
|
||||||
|
|
||||||
|
strace a = trace (show a) a
|
||||||
Loading…
Reference in New Issue
Block a user