{-# LANGUAGE OverloadedStrings #-}
module Main where
import Criterion.Main
import Data.Word
import HaskellWorks.Data.BalancedParens.FindClose
import HaskellWorks.Data.Bits.Broadword
import HaskellWorks.Data.Bits.FromBitTextByteString
import HaskellWorks.Data.Naive
import qualified Data.Vector.Storable as DVS
import qualified HaskellWorks.Data.BalancedParens.RangeMinMax as RMM
import qualified HaskellWorks.Data.BalancedParens.RangeMinMax2 as RMM2
setupEnvVector :: Int -> IO (DVS.Vector Word64)
setupEnvVector n = return $ DVS.fromList (take n (cycle [maxBound, 0]))
setupEnvRmmVector :: Int -> IO (RMM.RangeMinMax (DVS.Vector Word64))
setupEnvRmmVector n = return $ RMM.mkRangeMinMax $ DVS.fromList (take n (cycle [maxBound, 0]))
setupEnvRmm2Vector :: Int -> IO (RMM2.RangeMinMax2 (DVS.Vector Word64))
setupEnvRmm2Vector n = return $ RMM2.mkRangeMinMax2 $ DVS.fromList (take n (cycle [maxBound, 0]))
setupEnvBP2 :: IO Word64
setupEnvBP2 = return $ DVS.head (fromBitTextByteString "10")
setupEnvBP4 :: IO Word64
setupEnvBP4 = return $ DVS.head (fromBitTextByteString "1100")
setupEnvBP8 :: IO Word64
setupEnvBP8 = return $ DVS.head (fromBitTextByteString "11101000")
setupEnvBP16 :: IO Word64
setupEnvBP16 = return $ DVS.head (fromBitTextByteString "11111000 11100000")
setupEnvBP32 :: IO Word64
setupEnvBP32 = return $ DVS.head (fromBitTextByteString "11111000 11101000 11101000 11100000")
setupEnvBP64 :: IO Word64
setupEnvBP64 = return $ DVS.head (fromBitTextByteString "11111000 11101000 11101000 11101000 11101000 11101000 11101000 11100000")
benchRankSelect :: [Benchmark]
benchRankSelect =
[ env setupEnvBP2 $ \w -> bgroup "FindClose 2-bit"
[ bench "Broadword" (whnf (findClose (Broadword w)) 1)
, bench "Naive" (whnf (findClose (Naive w)) 1)
]
, env setupEnvBP4 $ \w -> bgroup "FindClose 4-bit"
[ bench "Broadword" (whnf (findClose (Broadword w)) 1)
, bench "Naive" (whnf (findClose (Naive w)) 1)
]
, env setupEnvBP8 $ \w -> bgroup "FindClose 8-bit"
[ bench "Broadword" (whnf (findClose (Broadword w)) 1)
, bench "Naive" (whnf (findClose (Naive w)) 1)
]
, env setupEnvBP16 $ \w -> bgroup "FindClose 16-bit"
[ bench "Broadword" (whnf (findClose (Broadword w)) 1)
, bench "Naive" (whnf (findClose (Naive w)) 1)
]
, env setupEnvBP32 $ \w -> bgroup "FindClose 32-bit"
[ bench "Broadword" (whnf (findClose (Broadword w)) 1)
, bench "Naive" (whnf (findClose (Naive w)) 1)
]
, env setupEnvBP64 $ \w -> bgroup "FindClose 64-bit"
[ bench "Broadword" (whnf (findClose (Broadword w)) 1)
, bench "Naive" (whnf (findClose (Naive w)) 1)
]
, env (setupEnvVector 1000000) $ \bv -> bgroup "Vanilla"
[ bench "findClose" (nf (map (findClose bv)) [0, 1000..10000000])
]
, env (setupEnvRmmVector 1000000) $ \bv -> bgroup "RangeMinMax"
[ bench "findClose" (nf (map (findClose bv)) [0, 1000..10000000])
]
, env (setupEnvRmm2Vector 1000000) $ \bv -> bgroup "RangeMinMax2"
[ bench "findClose" (nf (map (findClose bv)) [0, 1000..10000000])
]
]
main :: IO ()
main = defaultMain benchRankSelect