packages feed

jvm-batching-0.1: 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 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]