SBench-0.2.0: example/Test.hs
module Main where
import System.Environment ( getArgs )
import NFib ( nFib1, nFib2 )
import Test.SBench.STerm ( makeIntSeeds, toDataGen, toData, toNamedData )
import Test.SBench.Time.Series.Test ( nfRuntimeSeries )
import Test.SBench.Space.Single.Test ( getMemLine )
import Test.SBench.Space.Series.Test ( maxMemSeries )
import Test.SBench.Plot.Gnuplot ( series2scaledPlot, series2plot, sbench2scaledPlot, toDiagram, toDiagramWith )
import qualified Graphics.Gnuplot.Frame.OptionSet as Opt
import qualified Graphics.Gnuplot.Terminal.PostScript as PS
import qualified Graphics.Gnuplot.Terminal.PNG as PNG
doRuntimeTests bOpts rOpts =
let seeds = makeIntSeeds 1 10000 10 in
do dat_fib1 <- nfRuntimeSeries
(Just (bOpts, rOpts, "runtime_fib1", "fib1"))
nFib1
(toDataGen id "" "id")
seeds
dat_fib2 <- nfRuntimeSeries
(Just (bOpts, rOpts, "runtime_fib2", "fib2"))
nFib2
(toDataGen id "" "id")
seeds
let plt_fib1 = series2scaledPlot ((/(1000 :: Double)) . fromIntegral) (*1000000) "fib1" dat_fib1
plt_fib2 = series2scaledPlot ((/(1000 :: Double)) . fromIntegral) (*1000000) "fib2" dat_fib2
frameOpts = [ Opt.title "runtime comparism for Fibunacci number generators"
, Opt.xLabel "number of the Fibunacci number requested (*1000)"
, Opt.yLabel "runtime (microseconds)"
]
toDiagram "comp_runtime_fib" [PS.color] frameOpts [plt_fib1, plt_fib2]
-- | Create a heap profile for a function.
-- fib2 runs to fast to generate a profile, i.e., there is no sample measured,
-- so here only fib1 is measured.
doMemProfile =
let inp = toNamedData 3000000 "(3000000::Int)" in
do dat_fib1 <- getMemLine True ("memline_fib1", "fib1") nFib1 inp
let plt_fib1 = series2scaledPlot id ((/(1024*1024::Double)) . fromIntegral) "fib1" dat_fib1
frameOpts = [ Opt.title $ "heap consumption when calculating the "
++ show inp ++ "th Fibonacci number"
, Opt.xLabel "runtime (seconds)"
, Opt.yLabel "heap consumption (MBytes)"
]
toDiagram "comp_memline_fib" [PS.color] frameOpts [plt_fib1]
doMaxMemSeries =
let seeds = makeIntSeeds 1 10000 10 in
do dat_fib1 <- maxMemSeries True ("memline_fib1", "fib1") nFib1 (toDataGen id "" "id") seeds
dat_fib2 <- maxMemSeries True ("memline_fib2", "fib2") nFib2 (toDataGen id "" "id") seeds
let plt_fib1 = series2scaledPlot ((/(1000 :: Double)) . fromIntegral) ((/(1024::Double)) . fromIntegral) "fib1" dat_fib1
plt_fib2 = series2scaledPlot ((/(1000 :: Double)) . fromIntegral) ((/(1024::Double)) . fromIntegral) "fib2" dat_fib2
frameOpts = [ Opt.title $ "comparism of maximal heap consumption for Fibonacci number generators"
, Opt.xLabel "number of the Fibunacci number requested (*1000)"
, Opt.yLabel "heap consumption (kBytes)"
]
toDiagram "comp_maxmem_fib" [PS.color] frameOpts [plt_fib1, plt_fib2]
redoRuntimePlotAsPNG = do
plt_fib1 <- sbench2scaledPlot (/1000) (*1000000) "runtime_fib1"
plt_fib2 <- sbench2scaledPlot (/1000) (*1000000) "runtime_fib2"
let frameOpts = [ Opt.title "runtime comparism for Fibunacci number generators"
, Opt.xLabel "number of the Fibunacci number requested (*1000)"
, Opt.yLabel "runtime (microseconds)"
]
toDiagramWith (PNG.cons "comp_runtime_fib.png") frameOpts [plt_fib1, plt_fib2]
main = do
let bOpts = "unknown"
rOpts = "unknown"
putStrLn bOpts
putStrLn rOpts
doRuntimeTests bOpts rOpts
doMemProfile
doMaxMemSeries
redoRuntimePlotAsPNG