module Main where import Criterion.Main import Data.Word import HaskellWorks.Prim.Bits import qualified HaskellWorks.Prim.Bits.Fast as F import qualified HaskellWorks.Prim.Bits.Slow as S import qualified Data.Vector.Storable as DVS setupVector64 :: Int -> IO (DVS.Vector Word64) setupVector64 n = return $ DVS.fromList (take n (cycle [maxBound, 0])) setupVector32 :: Int -> IO (DVS.Vector Word32) setupVector32 n = return $ DVS.fromList (take n (cycle [maxBound, 0])) setup :: IO () setup = return () benchPdep64 :: [Benchmark] benchPdep64 = [ env (setupVector64 1) $ \bv -> bgroup "bits" [ bench "pdep64" (whnf (DVS.foldl pdep64 0) bv) ] , env (setupVector64 1) $ \bv -> bgroup "Fast" [ bench "pdep64" (whnf (DVS.foldl F.pdep64 0) bv) ] , env (setupVector64 1) $ \bv -> bgroup "Slow" [ bench "pdep64" (whnf (DVS.foldl S.pdep64 0) bv) ] ] benchPdep32 :: [Benchmark] benchPdep32 = [ env (setupVector32 1) $ \bv -> bgroup "bits" [ bench "pdep32" (whnf (DVS.foldl pdep32 0) bv) ] , env (setupVector32 1) $ \bv -> bgroup "Fast" [ bench "pdep32" (whnf (DVS.foldl F.pdep32 0) bv) ] , env (setupVector32 1) $ \bv -> bgroup "Slow" [ bench "pdep32" (whnf (DVS.foldl S.pdep32 0) bv) ] ] main :: IO () main = defaultMain (benchPdep64 ++ benchPdep32)