Skip to content

Commit ef60bf5

Browse files
committed
Implement basic criterion benchmarking suite
1 parent 667a431 commit ef60bf5

File tree

6 files changed

+82
-7
lines changed

6 files changed

+82
-7
lines changed

timeseries-io/bench/Bench.hs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{-# OPTIONS_GHC -Wno-name-shadowing #-}
2+
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
3+
{-# OPTIONS_GHC -Wno-deprecations #-}
4+
import Cardano.Logging (forHuman)
5+
import Cardano.Logging.Resources (ResourceStats, Resources (..), readResourceStats)
6+
import Cardano.Timeseries.Import.PlainCBOR
7+
import Cardano.Timeseries.Query (interp)
8+
import Cardano.Timeseries.Query.Expr (Expr)
9+
import Cardano.Timeseries.Query.Parser (expr)
10+
import Cardano.Timeseries.Query.Value (Error, Value)
11+
import Cardano.Timeseries.Store
12+
import Cardano.Timeseries.Store.Flat (Flat, Point (instant, name))
13+
import Cardano.Timeseries.Store.Parser (points)
14+
import Cardano.Timeseries.Store.Tree (fromFlat)
15+
16+
import Control.Monad (forever)
17+
import Control.Monad.Except (runExceptT)
18+
import Control.Monad.State.Strict (evalState)
19+
import Data.Attoparsec (skipMany)
20+
import Data.Attoparsec.Text (decimal, endOfInput, parseOnly, space)
21+
import Data.Either (fromRight)
22+
import Data.Foldable (for_, traverse_)
23+
import Data.Text (pack)
24+
import GHC.List (foldl')
25+
import System.Exit (die)
26+
import System.IO (hFlush, stdout)
27+
28+
import Criterion.Main
29+
30+
-- Given a snapshots file
31+
-- Given a query string
32+
-- Bench mark evaluation of the query
33+
34+
snapshotsFile :: String
35+
snapshotsFile = "data/6nodes_4hours_1mininterval.cbor"
36+
37+
query :: String
38+
query = "\
39+
\let start = milliseconds 1762173870000 in \
40+
\let period = minutes 10 in \
41+
\let F = range Forge_forged_counter \
42+
\(fast_forward epoch start) \
43+
\(fast_forward epoch (add_duration start period)) in \
44+
\increase F"
45+
46+
action :: Store s Double => (s, Expr) -> Value
47+
action (store, query) =
48+
let Right !x = evalState (runExceptT $ interp store mempty query 0) 0 in x
49+
50+
main :: IO ()
51+
main = do
52+
content <- readFileSnapshots snapshotsFile
53+
let flatStore = snapshotsToFlatStore content
54+
let treeStore = fromFlat flatStore
55+
case parseOnly (expr <* skipMany space <* endOfInput) (pack query) of
56+
Left err -> putStrLn err
57+
Right !query -> defaultMain
58+
[
59+
bench "flat" $ nf action (flatStore, query),
60+
bench "tree" $ nf action (treeStore, query)
61+
]
62+
7.83 MB
Binary file not shown.

timeseries-io/src/Cardano/Timeseries/Domain/Instant.hs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@ module Cardano.Timeseries.Domain.Instant(Instant(..), InstantVector, mostRecent,
22

33
import Cardano.Timeseries.Domain.Types (SeriesIdentifier, Timestamp)
44

5+
import Control.DeepSeq (NFData)
56
import qualified Data.Set as Set
67
import Data.Text (Text, intercalate, pack)
78
import Data.Vector
9+
import GHC.Generics (Generic)
810

911
-- | One datapoint in a series.
1012
data Instant a = Instant {
1113
labels :: SeriesIdentifier,
1214
timestamp :: Timestamp,
1315
value :: a
14-
} deriving (Show, Eq, Functor, Foldable, Traversable)
16+
} deriving (Show, Eq, Functor, Foldable, Traversable, Generic)
17+
18+
instance NFData a => NFData (Instant a)
1519

1620
-- | Do the instant vectors share a series?
1721
share :: Instant a -> Instant b -> Bool

timeseries-io/src/Cardano/Timeseries/Domain/Timeseries.hs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,25 @@
44
module Cardano.Timeseries.Domain.Timeseries(Timeseries(..), TimeseriesVector,
55
transpose, toVector, oldest, newest, eachOldest, eachNewest) where
66

7-
import Cardano.Timeseries.Domain.Instant (InstantVector, Instant (Instant))
7+
import Cardano.Timeseries.Domain.Instant (Instant (Instant), InstantVector)
88
import qualified Cardano.Timeseries.Domain.Instant as Instant
99
import Cardano.Timeseries.Domain.Types
1010

11+
import Control.DeepSeq (NFData)
1112
import Data.List (find, maximumBy, minimumBy)
1213
import Data.Set
1314
import qualified Data.Set as Set
1415
import Data.Vector (Vector)
1516
import qualified Data.Vector as Vector
17+
import GHC.Generics (Generic)
1618

1719
-- | A collection of datapoints sharing a series.
1820
data Timeseries a = Timeseries {
1921
labels :: SeriesIdentifier,
2022
dat :: [(Timestamp, a)]
21-
} deriving (Show, Functor, Foldable, Traversable)
23+
} deriving (Show, Functor, Foldable, Traversable, Generic)
24+
25+
instance NFData a => NFData (Timeseries a)
2226

2327
oldest :: Timeseries a -> Maybe (Instant a)
2428
oldest Timeseries{..} | Prelude.null dat = Nothing

timeseries-io/src/Cardano/Timeseries/Query/Value.hs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import Control.Monad.Except (ExceptT)
77
import Control.Monad.State.Strict (State)
88
import Data.Text (unpack)
99
import Data.Word (Word64)
10+
import Control.DeepSeq (NFData)
11+
import GHC.Generics (Generic)
1012

1113
type Error = String
1214
type FunctionValue = Value -> ExceptT Error (State Int) Value
@@ -30,7 +32,9 @@ data Value where
3032
-- | Timestamp (milliseconds since epoch)
3133
Timestamp :: Word64 -> Value
3234
-- | Function
33-
Function :: FunctionValue -> Value
35+
Function :: FunctionValue -> Value deriving Generic
36+
37+
instance NFData Value
3438

3539
instance Show Value where
3640
show (Scalar x) = show x

timeseries-io/timeseries-io.cabal

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ common common
2222
LambdaCase
2323
NamedFieldPuns
2424
OverloadedStrings
25-
StrictData
2625
Strict
2726

2827
library
@@ -40,7 +39,8 @@ library
4039
containers,
4140
mtl,
4241
trace-resources,
43-
trace-dispatcher
42+
trace-dispatcher,
43+
deepseq
4444

4545
exposed-modules:
4646
Cardano.Timeseries.Domain.Instant,
@@ -99,4 +99,5 @@ benchmark timeseries-io-bench
9999
mtl,
100100
trace-resources,
101101
trace-dispatcher,
102-
timeseries-io
102+
timeseries-io,
103+
criterion

0 commit comments

Comments
 (0)