module Main (main) where
import Criterion.Main
import System.Random
import Control.Monad
import Data.Semiring
import qualified Data.Vector as Vector
threeInts :: IO (Int,Int,Int)
threeInts = (,,) <$> randomIO <*> randomIO <*> randomIO
int :: IO Int
int = randomIO
sumAtSize :: Int -> Benchmark
sumAtSize n =
env (replicateM n threeInts) $
\xs ->
bgroup (show n) [bench "add" $ nf add xs]
prodAtSize :: Int -> Int -> Benchmark
prodAtSize n m =
env ((,) <$> replicateM n int <*> replicateM m int) $
\xs ->
bench "prod-list" (nf (uncurry (<.>)) xs)
prodAtSizeVec :: Int -> Int -> Benchmark
prodAtSizeVec n m =
env ((,) <$> Vector.replicateM n int <*> Vector.replicateM m int) $
\xs ->
bgroup
"vec"
[ bench (show n ++ "<.>" ++ show m) (nf (uncurry (<.>)) xs)
, bench (show m ++ "<.>" ++ show n) (nf (uncurry (flip (<.>))) xs)
, bench (show n ++ "<+>" ++ show m) (nf (uncurry (<+>)) xs)
, bench (show m ++ "<+>" ++ show n) (nf (uncurry (flip (<+>))) xs)
]
main :: IO ()
main =
defaultMain
[ prodAtSizeVec 4000 2000
, prodAtSizeVec 4000 2000]
-- prodAtSize 2000 1000, sumAtSize 10000]