packages feed

bloomfilter-blocked-0.1.0.0: bench/bloomfilter-bench.hs

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