module Main (main) where
import Criterion.Main (bench, bgroup, defaultMain, env, whnf)
import qualified Data.BloomFilter.Blocked as B.Blocked
import qualified Data.BloomFilter.Classic as B.Classic
import Data.Word (Word64)
import System.Random (StdGen, newStdGen, uniform)
main :: IO ()
main =
defaultMain [
bgroup "Data.BloomFilter.Classic" [
env newStdGen $ \g0 ->
bench "construct m=1e6 fpr=1%" $
whnf (constructBloom_classic 1_000_000 0.01) g0
, env newStdGen $ \g0 ->
bench "construct m=1e6 fpr=0.1%" $
whnf (constructBloom_classic 1_000_000 0.001) g0
, env newStdGen $ \g0 ->
bench "construct m=1e7 fpr=0.1%" $
whnf (constructBloom_classic 10_000_000 0.001) g0
]
, bgroup "Data.BloomFilter.Blocked" [
env newStdGen $ \g0 ->
bench "construct m=1e6 fpr=1%" $
whnf (constructBloom_blocked 1_000_000 0.01) g0
, env newStdGen $ \g0 ->
bench "construct m=1e6 fpr=0.1%" $
whnf (constructBloom_blocked 1_000_000 0.001) g0
, env newStdGen $ \g0 ->
bench "construct m=1e7 fpr=0.1%" $
whnf (constructBloom_blocked 10_000_000 0.001) g0
]
]
constructBloom_classic :: Int -> Double -> StdGen -> B.Classic.Bloom Word64
constructBloom_classic n fpr g0 =
let (!salt, !g1) = uniform g0 in
B.Classic.unfold (B.Classic.sizeForFPR fpr n) salt (nextElement n) (g1, 0)
constructBloom_blocked :: Int -> Double -> StdGen -> B.Blocked.Bloom Word64
constructBloom_blocked n fpr g0 =
let (!salt, !g1) = uniform g0 in
B.Blocked.unfold (B.Blocked.sizeForFPR fpr n) salt (nextElement n) (g1, 0)
{-# INLINE nextElement #-}
nextElement :: Int -> (StdGen, Int) -> Maybe (Word64, (StdGen, Int))
nextElement !n (!g, !i)
| i >= n = Nothing
| otherwise = Just (x, (g', i+1))
where
(!x, !g') = uniform g