-- | Search for a pattern in a file, find the number of occurences -- -- Tested in this benchmark: -- -- * Searching all occurences of a pattern using library routines -- module Benchmarks.Search ( benchmark ) where import Criterion (Benchmark, bench, bgroup, whnf) import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString.Lazy.Search as BL import qualified Data.ByteString.Search as B import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified Data.Text.IO as T import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.IO as TL benchmark :: FilePath -> T.Text -> IO Benchmark benchmark fp needleT = do b <- B.readFile fp bl <- BL.readFile fp t <- T.readFile fp tl <- TL.readFile fp return $ bgroup "FileIndices" [ bench "ByteString" $ whnf (byteString needleB) b , bench "LazyByteString" $ whnf (lazyByteString needleB) bl , bench "Text" $ whnf (text needleT) t , bench "LazyText" $ whnf (lazyText needleTL) tl ] where needleB = T.encodeUtf8 needleT needleTL = TL.fromChunks [needleT] byteString :: B.ByteString -> B.ByteString -> Int byteString needle = length . B.indices needle lazyByteString :: B.ByteString -> BL.ByteString -> Int lazyByteString needle = length . BL.indices needle text :: T.Text -> T.Text -> Int text = T.count lazyText :: TL.Text -> TL.Text -> Int lazyText needle = fromIntegral . TL.count needle