{-# LANGUAGE BangPatterns #-} {-# LANGUAGE ScopedTypeVariables #-} module Main where import Criterion.Main import qualified Data.ByteString as BS import qualified Data.ByteString.Internal as BSI import qualified Data.Vector.Storable as DVS import Data.Word import Foreign import HaskellWorks.Data.Positioning import HaskellWorks.Data.Succinct.RankSelect.Binary.Basic import System.IO.MMap setupEnvBs :: Int -> IO BS.ByteString setupEnvBs n = return $ BS.pack (take n (cycle [maxBound, 0])) setupEnvBss :: Int -> Int -> IO [BS.ByteString] setupEnvBss n k = setupEnvBs n >>= \v -> return (replicate k v) setupEnvVector :: Int -> IO (DVS.Vector Word64) setupEnvVector n = return $ DVS.fromList (take n (cycle [maxBound, 0])) setupEnvVectors :: Int -> Int -> IO [DVS.Vector Word64] setupEnvVectors n k = setupEnvVector n >>= \v -> return (replicate k v) setupEnvJson :: FilePath -> IO BS.ByteString setupEnvJson filepath = do (fptr :: ForeignPtr Word8, offset, size) <- mmapFileForeignPtr filepath ReadOnly Nothing let !bs = BSI.fromForeignPtr (castForeignPtr fptr) offset size return bs benchRankSelect :: [Benchmark] benchRankSelect = [ env (setupEnvVector 1000000) $ \bv -> bgroup "Rank" [ bench "Rank - Once" (whnf (rank1 bv) 1) , bench "Select - Once" (whnf (select1 bv) 1) , bench "Rank - Many" (nf (map (getCount . rank1 bv)) [0, 1000..10000000]) ] ] main :: IO () main = defaultMain benchRankSelect