{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} module Main where import Criterion.Main as Criterion import Control.DeepSeq import Data.Int import qualified Data.Vector as V import Data.List.Split (chunksOf) import qualified Data.Vector.Storable as VS import Language.Java import Language.Java.Batching () roundtrip :: forall a. (Reify a, Reflect a) => a -> IO () roundtrip a = pushWithSizeHint 30 $ (reflect a >>= reify :: IO a) >> pop intValues :: [Int32] intValues = [1..1000] vValues :: [VS.Vector Int32] vValues = [ VS.fromList [i, i] | i <- [1..500] ] benchBatching :: Benchmark benchBatching = deepseq intValues $ bgroup "roundtrips" [ bgroup "ints" [ bgroup "no batching" [ bench "list" $ nfIO $ roundtrip intValues , bench "storable array" $ nfIO $ roundtrip $ VS.fromList intValues ] , bgroup "batching" [ bench "bare" $ nfIO $ roundtrip $ V.fromList intValues , bench "unboxed vectors" $ nfIO $ roundtrip $ V.fromList $ map VS.fromList $ chunksOf (length intValues `div` 7) intValues , bench "boxed vectors" $ nfIO $ roundtrip $ V.fromList $ map V.fromList $ chunksOf (length intValues `div` 7) intValues ] ] , bgroup "int vectors" [ bgroup "no batching" [ bench "list" $ nfIO $ roundtrip vValues ] , bgroup "batching" [ bench "bare" $ nfIO $ roundtrip $ V.fromList vValues , bench "vectors of vectors" $ nfIO $ roundtrip $ V.fromList $ map V.fromList $ chunksOf (length vValues `div` 7) vValues ] ] ] main :: IO () main = withJVM ["-Djava.class.path=build/libs/jvm-batching.jar"] $ Criterion.defaultMain [benchBatching]