{-# 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]