{-# LANGUAGE FlexibleContexts #-}
module Main where
import Data.List.Split (splitOn)
-- import Data.Maybe (catMaybes)
-- import System.Process.Typed (readProcess_)
import BenchGraph (bgraph, defaultConfig, Config(..), ComparisonStyle(..))
import Data.List
-- import qualified Data.Text.Lazy as T
-- import qualified Data.Text.Lazy.Encoding as T
-- XXX use package name and a tag
packages :: [String]
packages =
[ "list"
, "pure-vector"
, "vector"
, "streamly"
, "streaming"
, "conduit"
, "pipes"
, "machines"
, "drinkery"
]
-------------------------------------------------------------------------------
main :: IO ()
main = do
{-
(out, _) <- readProcess_ "stack --system-ghc list-dependencies --bench"
-- Get our streaming packages and their versions
let match [] = Nothing
match (_ : []) = Nothing
match (x : y : _) =
case elem x packages of
False -> Nothing
True -> Just (x, y)
-- pkginfo is [(packagename, version)]
pkginfo =
catMaybes
$ map match
$ map words (lines (T.unpack $ T.decodeUtf8 out))
-}
let pkginfo = []
-- suffix versions to packages
let suffixVersion p =
case lookup p pkginfo of
Nothing -> p
Just v -> p ++ "-" ++ v
let title = "Cheaper Operations (Lower is Better)"
prefixes =
[ "elimination/toNull"
, "filtering/drop-all"
, "filtering/dropWhile-true"
, "filtering/filter-all-out"
, "elimination/last"
, "elimination/fold"
, "transformation/map"
, "filtering/take-all"
, "filtering/takeWhile-true"
, "filtering/filter-all-in"
, "filtering/filter-even"
, "transformation/scan"
]
cfg = defaultConfig
{ chartTitle = Just title
, outputDir = "charts"
, classifyBenchmark = \bm ->
case any (`isPrefixOf` bm) prefixes of
True ->
let xs = reverse (splitOn "/" bm)
in Just (suffixVersion (xs !! 0), xs !! 1)
False -> Nothing
, sortBenchmarks = \bs ->
let i = intersect (map (last . splitOn "/") prefixes) bs
in i ++ (bs \\ i)
, sortBenchGroups = \gs ->
let i = intersect (map suffixVersion packages) gs
in i ++ (gs \\ i)
}
bgraph "test/results.csv" "csv-mean-full" "mean" cfg
bgraph "test/results.csvraw" "csvraw-time-full" "time" cfg
bgraph "test/results.csvraw" "csvraw-time-delta" "time"
(cfg {setYScale = Just (-20000, 50000,7)
, comparisonStyle = CompareDelta
})
bgraph "test/results.csvraw" "csvraw-allocated-full" "allocated" cfg
bgraph "test/results.csvraw" "csvraw-bytescopied-full" "bytesCopied" cfg
bgraph "test/results.csvraw" "csvraw-mutatorWallSeconds-full" "mutatorWallSeconds" cfg
bgraph "test/results.csvraw" "csvraw-mutatorCpuSeconds-full" "mutatorCpuSeconds" cfg
bgraph "test/results.csvraw" "csvraw-gcWallSeconds-full" "gcWallSeconds" cfg
bgraph "test/results.csvraw" "csvraw-gcCpuSeconds-full" "gcCpuSeconds" cfg
bgraph "test/results.csvraw" "csvraw-cycles-full" "cycles" cfg
bgraph "test/results.csvraw" "csvraw-maxrss-full" "maxrss" cfg