{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE TypeFamilies #-} import Control.DeepSeq ( NFData, rnf ) import Control.Exception ( evaluate ) import Criterion.Main ( bench, bgroup, nf, defaultMain ) import Data.Function (on) import Data.Frame ( Column, Frameable, Indexable, Row, Frame ) import qualified Data.Frame as Frame import qualified Data.Vector as Vector import GHC.Generics ( Generic ) data Bench t = MkBench { field1 :: Column t Int , field2 :: Column t Int , field3 :: Column t Int , field4 :: Column t Int , field5 :: Column t Int , field6 :: Column t Int } deriving (Generic, Frameable) instance NFData (Row Bench) instance NFData (Frame Bench) instance Indexable Bench where type Key Bench = Int index = field1 main :: IO () main = do let rs = Vector.fromList [MkBench ix 0 0 0 0 0 | ix <- [0::Int .. 100_000]] fr = Frame.fromRows rs reversed = Frame.fromRows $ Vector.reverse rs evaluate $ rnf rs evaluate $ rnf fr evaluate $ rnf reversed defaultMain [ bgroup "Row-wise operations" [ bench "fromRows" $ nf (Frame.fromRows) rs , bench "toRows" $ nf (Frame.toRows) fr , bench "toRows . fromRows" $ nf (Frame.fromRows . Frame.toRows) fr , bench "fromRows . toRows" $ nf (Frame.toRows . Frame.fromRows) rs , bench "sortRowsBy" $ nf (Frame.sortRowsBy (compare `on` field1)) reversed , bench "sortRowsByKey" $ nf (Frame.sortRowsByKey) reversed ] , bgroup "Lookups" [ bench "lookup" $ nf (Frame.lookup 100) fr , bench "ilookup" $ nf (Frame.ilookup 99) fr , bench "at" $ nf (`Frame.at` (100, field5)) fr , bench "iat" $ nf (`Frame.iat` (99, field5)) fr ] , bgroup "Merging" [ bench "mergeWithStrategy" $ nf (Frame.mergeWithStrategy (Frame.matchedStrategy (\_ r1 _ -> r1)) fr) reversed ] ]