@@ -1,3 +1,4 @@
1+{-# LANGUAGE BangPatterns #-}
1-- | Replace a string by another string
2-- | Replace a string by another string
3-- Tested in this benchmark:
4-- Tested in this benchmark:
@@ -12,6 +13,9 @@ import Criterion (Benchmark, bgroup, bench, nf)
12import qualified Data.ByteString.Char8 as B
13import qualified Data.ByteString.Char8 as B
13import qualified Data.ByteString.Lazy as BL
14import qualified Data.ByteString.Lazy as BL
14import qualified Data.ByteString.Lazy.Search as BL
15import qualified Data.ByteString.Lazy.Search as BL
16+import qualified Data.ByteString.Search as B
17+import qualified Data.Text as T
18+import qualified Data.Text.Encoding as T
15import qualified Data.Text.Lazy as TL
19import qualified Data.Text.Lazy as TL
16import qualified Data.Text.Lazy.Encoding as TL
20import qualified Data.Text.Lazy.Encoding as TL
17import qualified Data.Text.Lazy.IO as TL
21import qualified Data.Text.Lazy.IO as TL
@@ -20,12 +24,20 @@ benchmark :: FilePath -> String -> String -> IO Benchmark
20benchmark fp pat sub = do
24benchmark fp pat sub = do
21 tl <- TL.readFile fp
25 tl <- TL.readFile fp
22 bl <- BL.readFile fp
26 bl <- BL.readFile fp
27+ let !t = TL.toStrict tl
23− return $ bgroup "Replace"
29+ return $ bgroup "Replace" [
24− [ bench "LazyText" $ nf (TL.length . TL.replace tpat tsub) tl
30+ bench "Text" $ nf (T.length . T.replace tpat tsub) t
25− , bench "LazyByteString" $ nf (BL.length . BL.replace bpat bsub) bl
31+ , bench "ByteString" $ nf (BL.length . B.replace bpat bsub) b
32+ , bench "LazyText" $ nf (TL.length . TL.replace tlpat tlsub) tl
33+ , bench "LazyByteString" $ nf (BL.length . BL.replace blpat blsub) bl
28− tpat = TL.pack pat
38+ tlpat = TL.pack pat
29− tsub = TL.pack sub
39+ tlsub = TL.pack sub
30− bpat = B.concat $ BL.toChunks $ TL.encodeUtf8 tpat
40+ bpat = T.encodeUtf8 tpat
41+ bsub = T.encodeUtf8 tsub
42+ blpat = B.concat $ BL.toChunks $ TL.encodeUtf8 tlpat
31− bsub = B.concat $ BL.toChunks $ TL.encodeUtf8 tsub
43+ blsub = B.concat $ BL.toChunks $ TL.encodeUtf8 tlsub