packages feed

jvm-streaming-0.3.1: benchmarks/Main.hs

{-# LANGUAGE ScopedTypeVariables #-}

module Main where

import Criterion.Main as Criterion
import Control.DeepSeq
import Data.Int
import Data.List (intersperse)
import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import qualified Data.Vector.Storable as VS
import Language.Java
import Language.Java.Streaming ()
import Language.Java.Streaming.Jars (getJars)
import Streaming (Of, Stream)
import qualified Streaming.Prelude as Streaming

roundtrip :: forall a. (Reify a, Reflect a) => a -> IO ()
roundtrip a = pushWithSizeHint 30 $ (reflect a >>= reify :: IO a) >> pop

intValues :: [Int32]
intValues = [1..4000]

vValues :: [VS.Vector Int32]
vValues = [ VS.fromList [i, i] | i <- [1..2000] ]

benchBatching :: Benchmark
benchBatching = deepseq intValues $
    bgroup "roundtrips"
    [ bgroup "ints"
      [ bgroup "no batching"
        [ bench "list" $ nfIO $ roundtrip intValues
        ]
      , bgroup "batching"
        [ bench "streams" $ nfIO $ roundtrip
            (Streaming.each intValues :: Stream (Of Int32) IO ())
        ]
      ]
    , bgroup "int vectors"
      [ bgroup "no batching"
        [ bench "list" $ nfIO $ roundtrip vValues
        ]
      , bgroup "batching"
        [ bench "streams" $ nfIO $ roundtrip
            (Streaming.each vValues :: Stream (Of (VS.Vector Int32)) IO ())
        ]
      ]
    ]

main :: IO ()
main = do
    jars <- getJars
    let classpath = concat $ intersperse ":" jars
    withJVM [Text.encodeUtf8 $ Text.pack $ "-Djava.class.path=" ++ classpath] $
      Criterion.defaultMain [benchBatching]