packages feed

jvm-streaming-0.3: benchmarks/Main.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Main where

import Criterion.Main as Criterion
import Control.DeepSeq
import Data.Int
import qualified Data.Vector.Storable as VS
import Language.Java
import Language.Java.Streaming ()
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 =
    withJVM ["-Djava.class.path=../jvm-batching/build/libs/jvm-batching.jar"] $
      Criterion.defaultMain [benchBatching]